1.需要用到的窗体和类


主窗体代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace StaffCheck
{public partial class FrmMain : Form{public FrmMain(){InitializeComponent();}//列表,保存SE对象public List<SE> programmerList = new List<SE>();//打卡记录Dictionarypublic Dictionary<string, Record> RecordList = new Dictionary<string, Record>();//新增员工窗体private void toolStripLabel1_Click(object sender, EventArgs e){//新增员工窗体FrmInsert fl = new FrmInsert();//维护类型 ,1表示新增,0表示修改//fl.MaintanceType = 1;fl.FrmParent = this;//this就是获得当前的对象,通过this.调用当前对象的属性或者方法,
            fl.Show();}//刷新DataGridView数据public void BindGrid(List<SE> list){this.dgvStaffInfo.DataSource = new BindingList<SE>(list);}private void btnSrarch_Click(object sender, EventArgs e){//查看,支持模糊查询List<SE> tempList = new List<SE>();//用临时列表保存查询到的信息foreach (SE item in this.programmerList){ if (item.Id.IndexOf(this.txtId.Text.Trim())!=-1){tempList.Add(item);}}this.dgvStaffInfo.DataSource = new BindingList<SE>(tempList);}private void dgvStaffInfo_CellContentClick(object sender, DataGridViewCellEventArgs e){}//点击删除按钮private void toolStripLabel3_Click(object sender, EventArgs e){//是否选中一行if (this.dgvStaffInfo.SelectedRows.Count > 0){DialogResult choice = MessageBox.Show("确定要删除吗?", "提示", MessageBoxButtons.OKCancel);if (choice == DialogResult.OK){//拿到选中的员工号进行删除string id = this.dgvStaffInfo.SelectedRows[0].Cells[0].Value.ToString();for (int i = 0; i < programmerList.Count; i++){if (programmerList[i].Id == id){//执行删除操作
                            programmerList.Remove(programmerList[i]);//刷新DataGridView
                            BindGrid(programmerList);MessageBox.Show("删除成功!");}}}else{MessageBox.Show("请选择一行!");return;}}}private void FrmMain_Load(object sender, EventArgs e){//初始化信息
            initial();}/// <summary>/// 初始化信息/// </summary>private void initial(){programmerList.Add(new SE() { Id = "1", Name = "蛮子", Age = 28, Gender = Gender.男.ToString() });programmerList.Add(new SE() { Id = "2", Name = "光辉", Age = 30, Gender = Gender.女.ToString() });programmerList.Add(new SE() { Id = "3", Name = "皇子", Age = 34, Gender = Gender.男.ToString() });this.dgvStaffInfo.DataSource = new BindingList<SE>(programmerList);}//签到private void 签到ToolStripMenuItem_Click(object sender, EventArgs e){//验证有选中的一行if (this.dgvStaffInfo.SelectedRows.Count > 0){//确保没有签过到string qiandao = this.dgvStaffInfo.SelectedRows[0].Cells[0].Value.ToString();//MessageBox.Show(qiandao);  foreach (string id in RecordList.Keys){if (qiandao==id){MessageBox.Show("您已经签过到!");return;}}//执行签到Record record = new Record();record.ID = qiandao;record.Name = dgvStaffInfo.SelectedRows[0].Cells[1].Value.ToString();record.SignInTime = DateTime.Now;//获取系统当前时间this.RecordList.Add(record.ID,record);//添加到签到记录MessageBox.Show("签到成功!");}else{MessageBox.Show("请选中一行!");return;}}private void toolStripLabel4_Click(object sender, EventArgs e){//打卡记录//绑定数据源,显示DictionaryFrmRecord fr = new FrmRecord();fr.RecordList = this.RecordList;//t获得当前的对象,通过this.调用当前对象的属性或者方法,
            fr.Show();}//签退private void 签退ToolStripMenuItem_Click(object sender, EventArgs e){//签退操作//确保有选中的行if (this.dgvStaffInfo.SelectedRows.Count > 0){string ID = dgvStaffInfo.CurrentRow.Cells[0].Value.ToString();bool isOut = false;//标志是否已经签过到foreach (string key  in RecordList.Keys){if(key==ID){             //执行签到,设置签退时间this.RecordList[key].SignOutTime = DateTime.Now;//获得当前系统时间,也就是签退的时间MessageBox.Show("签退成功");isOut = true;break;}}if (!isOut){MessageBox.Show("很抱歉尚未签到!");}}else{MessageBox.Show("请选中一行!");return;}}}
}

添加窗体代码

  public partial class FrmInsert : Form{//保存父窗体的引用public FrmMain FrmParent { get; set; }public FrmInsert(){InitializeComponent();this.cbSex.SelectedIndex = 0;//初始化,显示男
        }private void button1_Click(object sender, EventArgs e){//单击保存按钮
            save();}/// <summary>/// 保存/// </summary>private void save(){try{//输入处理SE pr = new SE();//员工类pr.Id = this.txtId.Text.Trim();//工号pr.Name = this.txtName.Text.Trim();//姓名  pr.Age = Int32.Parse(this.txtAge.Text.Trim());//年龄if (this.cbSex.SelectedItem.ToString() == "男")//性别
                {pr.Gender = Gender.男.ToString();}else{pr.Gender = Gender.女.ToString();}//添加操作//工号唯一性验证foreach (SE item in FrmParent.programmerList){if (item.Id == pr.Id){MessageBox.Show("此工号已经存在!");return;}                  }FrmParent.programmerList.Add(pr);//将输入的信息添加到集合中this.Close();}catch (Exception ex){MessageBox.Show("异常!" + ex.Message);}finally{//刷新父窗体的信息this.FrmParent.BindGrid(FrmParent.programmerList);}}private void FrmInsert_Load(object sender, EventArgs e){}}

打卡记录窗体代码

 public partial class FrmRecord : Form{public FrmRecord(){InitializeComponent();}public  FrmMain fm{get;set;}//主窗体对象public Dictionary<string, Record> RecordList; private void FrmRecord_Load(object sender, EventArgs e){this.dgvRecords.AutoGenerateColumns = false;//去掉多余的列  //打卡记录//绑定数据源,显示DictionaryBindingSource bs = new BindingSource();bs.DataSource =RecordList.Values;this.dgvRecords.DataSource = bs;Rows();//打印行数
                    }/// <summary>/// 打印显示行数/// </summary>public void Rows(){int row = this.dgvRecords.RowCount;//拿到行数this.laNumber.Text = "共有" + row + "条打卡记录";}private void dgvRecords_CellContentClick(object sender, DataGridViewCellEventArgs e){}  }

遇到的难点及问题

1.使用单列泛型集合(List<T>)绑定DataGridView,可以直接绑定,这里使用集合作为参数

public void  BindGrid(List<SE>   list)

{

this.dgvprogrammer.DataSource = new BindingList<SE>(list)//绑定list集合到dgvprogrammer

}

2.添加完成以后,关闭添加窗体,并刷新父窗体。

在finally中重新绑定以下数据源即可。

3.根据员工工号模糊查询。

用string类的IndexOf( )方法实现模糊查询

List<SE> tempList = new List<SE>( );//用临时集合保存查询到的信息

foreach(SE item in this.programmerList)

{

if(item.ID.IndexOf(this.txtID,Text.Trim()!=-1))//indexof() :在字符串中从前向后定位字符和字符串;所有的返回值都是指在字符串的绝对位置,如为空则为- 1,如果有就将其遍历出来

{

     tempList.Add(item);

}

}

this.dgvprogrammer.DataSource = new BindingList<SE>(tempList);//重新绑定到DataGridView上

4.DataGridView控件显示Dictionary集合(双列集合)中的数据,不能直接绑定。

BindingSource bs = new BindingSource();//绑定源

bs.DataSource =recordList.Values;//拿到集合中的Value;

this.dgvRecords.DataSource=bs;//绑定到DatatGridView上。

5.关于在用索引拿DataGridView中选中一行的值时出现的拿错值的问题。

如。this.DataGridView.SelectedRows[0].Cells[0].Value;为什么尽量用列名去拿,如:this.DataGridView.SelectedRows[0].Cells[“Name”].Value;

因为在拿选中行的值的时候你封装字段的顺序是会影响用索引拿值,经过打断点测试,确实如此。

6.关于重复签退的问题

每个员工在每天应该只能签退一次。

转载于:https://www.cnblogs.com/java-123/p/8722833.html

员工打卡案列使用泛型集合的解决方法以及一些遇到的问题(2018年4月4号突如其来的雪花纷飞)...相关推荐

  1. php execl 列的长度,php生成excel列名超过26列大于Z时的解决方法

    本文实例讲述了php生成excel列名超过26列大于Z时的解决方法.分享给大家供大家参考.具体分析如下: 我们生成excel都会使用phpExcel类,这里就来给大家介绍在生成excel列名超过26列 ...

  2. 微信的行程卡服务器异常,行程卡打不开服务器崩了解决方法 行程卡短信查询步教程...

    今天滚天游戏网小编为大家带来行程卡打不开服务器崩了解决方法 行程卡短信查询步教程,希望能帮助到大家. 部分地区的健康码程序也无法打开,比如山东电子健康码.信息提示,由于当前访问人数过多,小程序可能会出 ...

  3. win7为什么打开桌面上的计算机很卡很慢,Win7系统运行不流畅卡半天才进入桌面的六种解决方法...

    现如今是一个快速发展的时代,win7系统运行速度成为大家比较关心的一个话题,有时候部分用户会遇到Win7系统运行不流畅卡半天才进入桌面的情况,也不知道怎么回事?相信大家一定会很烦恼吧.针对 Win7系 ...

  4. 服务器 战地4 无限载入,战地4卡在loading界面无限载入的解决方法_快吧单机游戏...

    今天为大家带来<战地4>卡在loading界面无限载入的解决方法,和大家一起分享一下我总结的几点方法,希望大家游戏愉快! 温馨提示:首先说下卡在loading界面的问题,所谓卡loadin ...

  5. Ubuntu16.06 单Nvidia显卡 深度学习运行时 界面卡顿(刷新慢)的解决方法

    关于Ubuntu单Nvidia显卡 深度学习运行时 界面卡顿(刷新慢)的解决方法 背景 我在按照 本链接 的第二种方法安装后,成功安装cuda 10.0与cudnn之后,在深度学习训练过程中发现了严重 ...

  6. thinkpad卡在logo界面_win7系统开机卡在开机Thinkpad LOGO画面的解决方法

    我们在操作电脑的时候,win7系统开机卡在开机Thinkpad LOGO画面的问题对于我们来说其实是比较少见的,一般情况下的正常使用都不会遇到win7系统开机卡在开机Thinkpad LOGO画面的状 ...

  7. android电视直播卡顿,电视盒子看直播卡顿原因分析以及教你解决方法!

    原标题:电视盒子看直播卡顿原因分析以及教你解决方法! 其实关于智能机顶盒.智能电视大家最想了解的就是想知道到底能不能流畅的看直播.看视频电影,这里我可以很负责的告诉大家:想要高清.完全不卡顿的看直播电 ...

  8. oracle一直在更新注册表,联想10代cpu电脑装win7后卡在正在更新注册表设置解决方法...

    [文章导读]最近有很多网友问我联想电脑10代cpu台式机安装win7卡在在更新注册表设置怎么办?出现这种情况一般情况是由于没有提前注入显卡驱动,现在很多新电脑都采用的集成显卡,10代以cpu采用的集显 ...

  9. 笔记本卡顿不流畅是什么原因_电脑卡顿不流畅的原因以及解决方法

    原标题:电脑卡顿不流畅的原因以及解决方法 一般来说,引起电脑卡顿不流畅的原因无非就是软件和硬件两个方面,软件主要包括系统优化不佳,比如同时打开很多软件,造成电脑卡顿不流畅.硬件主要为电脑配置过低或者硬 ...

最新文章

  1. 2021年大数据Hadoop(十二):HDFS的API操作
  2. python简史_命令行简史
  3. oracle sqlplus @@用法
  4. java(十六) 对象的this引用
  5. c语言编程中句柄无效怎么解决,句柄无效,手把手教你句柄无效怎么解决
  6. 润乾报表分组求和_一招搞定各种报表合计需求
  7. uinty粒子系统子物体变大_Unity2018粒子系统全息讲解,坑深慎入(3)
  8. Bootstrap圣诞节主题商城网站模板
  9. rv1126 固件编译规则
  10. ContextCapture与Pix4D生成正射影像并进行拼接修图(附航测练习数据下载)
  11. 浙江大学软件工程c语言复试题库,2022浙江大学软件工程考研经验备考指导
  12. 阳春三月,正是樱花绽放时,借此机会给午饭献上鲜艳艳的视觉盛宴!
  13. Python爬虫学习总结
  14. 阿里云申请和部署项目
  15. 马路上“低头族”的交通隐患 ,小心埋头苦干的恶果
  16. 怎么把ppt转化成图片
  17. mac 下Protege中使用OWL Viz插件
  18. 最适合0基础入门的5种编程语言
  19. 配置高档游戏型计算机,2021年游戏台式电脑配置推荐
  20. python爬虫今日头条_python 简单爬取今日头条热点新闻(

热门文章

  1. css标签不换行,CSS不换行与CSS换行
  2. 国产蓝牙耳机怎么挑选?口碑最好的国产蓝牙耳机
  3. ICCV 2019,中国力量不容小觑,中科院、清华领跑
  4. 我的服务端之C++网络库对外接口
  5. 全媒体运营师胡耀文教你:4个私域流量直播案例复盘
  6. 管道式广谱感应水处理器详细介绍
  7. voyage-linux系统,evoyage
  8. R语言使用dplyr包的arrange函数依据dataframe数据的指定数据列对dataframe进行排序(默认从小到大)
  9. 【Nginx】Nginx原理与应用
  10. 微信小程序从开发到发布流程