图一 数据库中的考勤记录
图二 整理后的考勤记录
设计思路:
①将数据库中的第一行数据写入到DataGridView中,此时读取数据的指针在图一的第一行的考勤时间处,写入数据的指针在图二的时间1处;
②读取指针下移到第二行,利用该行的姓名、考勤日期与图二中第一行的姓名和考勤日期做对比,如果日期和姓名都一致表示的是同一个人的第二次刷卡,那么写入的指针移动到时间2处,并将读取指针所在行的考勤时间写入到时间2中。
③重复②的操作,如果姓名、日期不相等,则表示是第二天或者另一个人。那么写入的指针下移一行,进行数据写入。
设计代码:
DataTable table = new AttenBLL().GetAllByDate(fromDateTime, toDateTime); if (!(table == null)) { for (int tri= 0,row=0; tri < table.Rows.Count; row++) //行数,在到此处时,tri已经增加过了,此处不需要增加 { //20160919如果行不为0,则自动增加一行//去掉条件判断,只要进入循环,DGV行自动+1 dgvAttenData.Rows.Add(1); dgvAttenData.Rows[row].Cells[0].Value = row+1; //序号,循环异常,序号增加1 dgvAttenData.Rows[row].Cells[1].Value = table.Rows[tri][1].ToString(); //考勤号 dgvAttenData.Rows[row].Cells[2].Value = table.Rows[tri][2].ToString(); //姓名 dgvAttenData.Rows[row].Cells[3].Value = table.Rows[tri][3].ToString(); //部门 dgvAttenData.Rows[row].Cells[4].Value = table.Rows[tri][4].ToString(); //星期 dgvAttenData.Rows[row].Cells[5].Value = table.Rows[tri][5].ToString(); //考勤日期 dgvAttenData.Rows[row].Cells[6].Value = table.Rows[tri][6].ToString(); //考勤时间 //i table。rows的增加量;j dgv 列的增加量,从7开始,暂时考勤次数最多为4次 for (int j=7;j<11 ;j++) { tri++; if ((tri) < table.Rows.Count) { if (table.Rows[tri][5].ToString() == dgvAttenData.Rows[row].Cells[5].Value.ToString() && table.Rows[tri][1].ToString()==dgvAttenData.Rows[row].Cells[1].Value.ToString()) { dgvAttenData.Rows[row].Cells[j].Value = table.Rows[tri][6].ToString(); } else { break; } } } } }
问题:使用这种方式获取数据,按行读取,按行判断、按行写入。效率低下、界面闪动厉害,不知道目前的考勤软件是怎么对考勤数据进行处理的。
下篇预告:根据每天的考勤记录,技术迟到、早退的时间。