C#学习记录之第五天

昨天写到了datagirdview绑定数据,但是默认情况下所有控件 都是text类型,数据库里边有一个bool类型的值,我想把它以checkbox的形式显示出来,改了好几遍

最后成功了:

方法是右击datagirdview表格,选择编辑列,然后添加一列。之后如下设置:

true和false是来设置与你给的数据对应的情况 下的选中状态。


这个成功绑定的。因为程序要用到监听,所以得新开线程来监听刷卡器状态,发现线程start()之后只执行一次。==。跟java不一样啊!!之后问了别人才知道就算新开线程也得用个while循环这种让这个线程不断的start。不过我觉得这样也不错啊。start可以手动控制,恩。。

 private void button1_Click(object sender, EventArgs e)
        {
           
            Thread ti = new Thread(threadmain);
            ti.Start();
           
        }
        void threadmain()
        {
            while(i<100){
            i++;
            textBox1.Text = i + "";
            Thread.Sleep(50);
            }
        }
睡眠50ms。执行把文本框设置文本从1到100。


这样就可以把前几天的成果一点点集成起来了,有一本著名的书叫《重构》,运用里面的少量多次原则,把之前按键读卡的代码部分提取出来为一个方法。然后放在一个新的线程里。

   Thread t = new Thread(readcard);
            t.Start();
            
睡眠500ms,成功达到了想要结果。


下一步是实现录入,正常的步骤是输入相当的信息,然后刷卡读取卡号进行录入到数据库中。

以我的经验总觉得这个数据库方面输入中文会出现问题,所以先试一下,这下正式的建一个表。

string sql = "CREATE TABLE if not exists student(bool isarrived,name varchar(20),id varchar(20),stu_class varchar(20),card_id varchar(20))";

现在写插入值:

sql = "INSERT INTO student VALUES('true','韦毅雄','2012011294','软件工程1班','C1 43 CF 11')";

            cmd.CommandText = sql;

            cmd.ExecuteNonQuery();


然后这个数据库经测试可以正常工作了:

下一步实现录入信息,先输入一部分信息,当卡放上去时将其数据连带卡号一起输入。

现在将以前的功能融入进来即datagirdview控件绑定数据库。


因为这个控件有个自动扩展的功能,最后一行如果编辑了数据为自动增加一行,所以我的思路是当判断前面所有的信息都输入齐了之后,此时有卡号信息和前面输入的一起插入到数据库内。

然后有个同学告诉我说那个闪电的标志里边有相应的事件,马上去看看。发现一个

RowStateChanged
事件。不过这个事件在每次增加或删除一条的时候就会执行。。看看有没有更好的,没有的话多写点代码还是可以用的。

UserAddedRow
这个事件是当用户手动添加一条时触发的,更符合需求了。

但是这个是添加时出现的。之后还要编辑啊。恩,想了一下还是用刷卡器触发吧。

实在不行提示一下少了哪条数据,

那现在的问题就直接转移到了如何获取最后一条的文本数据了,这个应该挺简单的了吧。

写个get方法。刚写private,发现不方便,直接在读卡线程里调用一个创建insertdata方法,把value(卡号)传到方法里,在那个insert方法里获得数据,若万事大吉就可以插入了,少哪个值的话还可以提示。恩


试了一下发现取值的时候会出现错误,代码如下

   int row;
            int cell;
            row=dataGridView1.Rows.Count;
          
            string name=dataGridView1.Rows[row].Cells[1].Value.ToString();
            MessageBox.Show(name);

我想这样就应该能获得最后一行各列的值了。、为什么别人就行,,我怀疑是越界。经过验证改成row-3,确实可以,可是我也怀疑是不是空值也会产生错误,再验证一下,发现确实是这样,那就又有疑问了,是这个tostring方法因为null而产生错误还是取值的时候的问题呢,测试一下:

  string s = null;
            s.ToString();
发现和刚才的错误一样,看来这个tostring方法在转空值时会产生问题,那就好办了,把代码再整理一下:
  if (dataGridView1.Rows[row - 1].Cells[1].Value != null)
            {
                MessageBox.Show(dataGridView1.Rows[row - 1].Cells[1].Value.ToString());
            }
            else
            {
                MessageBox.Show("请输入姓名");
            }
这样就不会产生错误了。

又出现新问题了。当我没有绑定dataset时,上述语句是有效的,但是当我绑定了dataset之后发现取值回来的不是null,也不是“”,郁闷了,要想取这个值还难,因为上面就是要把这个值tostring的时候 出的错。。啊啊啊。

 name=dataGridView1.Rows[row - 2].Cells[1].Value.ToString();
               string s = "!!";
               s+=name;
               s+="!!";
               MessageBox.Show(s);
这样我把这个值夹在中间,然后输出出来的是!!!!所以这个值好像是"";
 if (dataGridView1.Rows[row - 2].Cells[1].Value != null&&!dataGridView1.Rows[row - 2].Cells[1].Value.ToString().Equals(""))
最后改成这样成功的过滤掉了空值。

在这里我发现一个问题,这个列的顺序好奇怪,,虽然说我能改对。但是这个问题也太揪心了,,

想了一会儿明白了,这个列的顺序是根据我数据库的字段名顺序里定的,虽然看起来是先是班级后是学号,可是这个顺序是按生成的顺序来定的,不管你懂不懂,,反正 我懂了。。

这回一放卡上去就有能获得表内数据了,下一步就写入数据 ,吼吼,

写sql语句真是一件很难受的感觉 ,一堆" " '还在把变量名加进去,乱死了。。



看上去是一点错没有,但是就是插入不进去,我有一个习惯,当sql语句 不对的时候我就把这个语句 输出 出来 直接复制到mysql的命令里,看看能不能执行就对了。为此我还加了一个textbox控件 一为了省事,二为了确保跟程序里边的完全 一样。


然后,,这倒是我不想看到的。。这样我一点头绪都没了。。

 两分钟之后罪魁祸首找到了。。太粗心了。。

 cmd.Connection = conn;

忘了给命令添加连接了。

OK全部搞定,现在可以按照一开始的需求录入信息了,距离完成的日期越来越近了~。放松一下吧~看会儿人类星球,哈哈。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值