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


    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>();
            //打卡记录Dictionary
          public 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)
            {
                //打卡记录
                //绑定数据源,显示Dictionary
                FrmRecord 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;//去掉多余的列  
                //打卡记录
                //绑定数据源,显示Dictionary
                BindingSource 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.关于重复签退的问题

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

     

  • 相关阅读:
    【348】通过 Numpy 创建各式各样的矩阵
    【347】将jupyter notebook嵌入博客园
    【346】TF-IDF
    【345】机器学习入门
    Python 学习入门(28)—— 服务器实例
    HDU 1518 Square
    建立树莓派raspberry交叉编译环境以及编译内核
    Android源码分析-消息队列和Looper
    oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。
    Unity手游之路<六>游戏摇杆之Easy Touch 3教程
  • 原文地址:https://www.cnblogs.com/java-123/p/8722833.html
Copyright © 2020-2023  润新知