先说说已完成的部分,因为这部分是在上课时间写的,所以没记得特别细。
上课写的部分是加了一个快速搜索栏,可以输入学号后对datagridview中的值快速搜索,我觉得这个控件甚至可以当做一个数据存储结构来用,只要将其可见性设置为false就可以了。
首先加一个textbox控件,然后本想找那个text属性来的,结果没找到,在form的初始化方法里边加了一个datainit方法,里边用于将textbox的值设置为"输入学号快速查找",这个是用来提示用户的,然后给这个textbox控件设置一个单击事件,当鼠标选中它时,自动将text清空方便用户输入,在焦点离开这个控件时,再将其恢复为提示词,当然这个还可以进一步优化,就是焦点离开控件时再判断一下里边的值是否为空,不为空则不恢复为提示词,这个以后再说。
然后在textbox控件的textchanged事件里,写上遍历表格,如有
if (dataGridView1.Rows[i].Cells[2].Value.ToString().Trim().IndexOf(textBox1.Text.Trim()) != -1)
{
dataGridView1.ClearSelection();
dataGridView1.Rows[i].Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = i;
break;
}
第一行是用来判断是否包含这个搜索词的字符串,然后清楚所有选定,避免多选的情况,再设置为selected状态,
FirstDisplayedScrollingRowIndex
是为了将视图滚动至被选中的那行上。
下一步就是添加状态栏,显示应到人数和实到人数。
当刷卡时和手动点击签到时发生一个遍历签到状态的方法,然后统计人数并刷新状态栏。
目前遇到的问题是
我试了valuechanged事件,还有mouseup事件,还有contentclick事件,但是都不能得到想要的效果,总是比刷新的值半一步,换一个说法就是,在我遍历之后这个checkbox的值才会被设置为true,所以我统计的人数总是比实际的少一个。
结论是只有当焦点离开输入框的时候值的改变才会生效。
想了半天,最终的解决办法是一个我认为很巧妙的方法,就是给mouseup事件写一条语句,让其currentcell=null,也就是当鼠标抬起的那一该自动让其取消焦点,这样就相当于自动给这个值点了一下确定,这样就能正常工作了。累死脑子了。。