昨天写到了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全部搞定,现在可以按照一开始的需求录入信息了,距离完成的日期越来越近了~。放松一下吧~看会儿人类星球,哈哈。