先说几句,作为一个还在学习的程序员,掌握的知识有限;但我利用自身所学,给一些像我一样还在学习的码农提供我的绵薄之力!

写的不好,但是尽力了,希望大牛指点。多多吐槽!!!

好了开始说项目需求: 实现新增员工;使用DataGridView控件展示员工信息;实现根据员工工号进行模糊查询;实现删除员工信息;每天只能签到一次;签退前必须已经签到

看到这些需求,我们先要思考下该做什么,理清思路才能更快的完成项目。我通常先搭建窗体,然后根据要求逐步实现项目要求!

这是我们所要用的到的三个窗体

我们建一个辅助类,初始化一个单列的泛型集合,给单列的泛型集合付个初值

class Worker
{
private string id;
private string name;
private int age;
private string sex;
public string ID
{
get
{
return id;
} set
{
id = value;
}
} public string Name
{
get
{
return name;
} set
{
name = value;
}
} public int Age
{
get
{
return age;
} set
{
age = value;
}
} public string Sex
{
get
{
return sex;
} set
{
sex = value;
}
} public static List<Worker> list = new List<Worker>();
public static void Insert()
{
Worker w1 = new Worker();
w1.ID = "20090101";
w1.Name = "王小毛";
w1.Age = 20;
w1.Sex = "男";
list.Add(w1);
Worker w2 = new Worker();
w2.ID = "20090102";
w2.Name = "周新雨";
w2.Age = 19;
w2.Sex = "女";
list.Add(w2);
}
}

 这是员工信息维护窗体的Load事件的代码

 private void FrmSecond_Load(object sender, EventArgs e)
{
如果list没有数据就添加数据,确保调用这个窗体是,只有在没有数据时才能添加数据!
if (Worker.list.Count==0)
{
Worker.Insert();
}
清除datagridview的英文列,并且绑定数据
dgvList.AutoGenerateColumns = false;
dgvList.DataSource = Worker.list;
}

 这是新增里的代码

private void toolStripButton1_Click(object sender, EventArgs e)
{
调用添加员工员工信息窗体
FrmFirst ff = new FrmFirst();
this.Hide();
ff.Show();
}
private void btn1_Click(object sender, EventArgs e)
{
确保一个工号只能添加一次
foreach (Worker item in Worker.list)
{
if (item.ID==txt01.Text)
{
MessageBox.Show("工号已存在!!!!");
return;
} }
添加一个员工信息
Worker w1 = new Worker();
w1.ID = txt01.Text;
w1.Name = txt03.Text;
w1.Age = Convert.ToInt32(txt02.Text);
w1.Sex =cob01.Text;
Worker.list.Add(w1);
FrmSecond fs = new FrmSecond();
this.Close();
fs.Show(); }

 

这是删除的代码
private void toolStripButton3_Click(object sender, EventArgs e)
{
提示点击是才会删除
DialogResult result = MessageBox.Show("提示","是否删除",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
if(result==DialogResult.Yes)
{
string id = dgvList.SelectedRows[0].Cells[0].Value.ToString();
//string id = dgvList.SelectedCells[0].Value.ToString();
如果ID和我选中的ID相等才会删除
foreach (Worker item in Worker.list)
{
if(item.ID==id)
{
Worker.list.Remove(item);
break;
}
}
}
//dgvList.AutoGenerateColumns = false;
dgvList.DataSource = new BindingList<Worker>(Worker.list); }

 

这段是重点难点在写这段之前先建好另一个辅助类
  class Record
    {
        public string id { get; set; }
        public string name { get; set; }
        public DateTime SignInTime { get; set; }
        public DateTime SignOutTime { get; set; }
        创建一个双列泛型集合
        public static Dictionary<string, Record> relist = new Dictionary<string, Record>();
      
    } public int num;
private void 签到ToolStripMenuItem_Click(object sender, EventArgs e)
{
给num赋值,把你选中的type值付给num
Worker w = new Worker();
foreach (Worker item in Worker.list)
{
if (item.Name == dgvList.SelectedCells[1].Value.ToString())
{
w = item;
break;
}
}
num = w.type;
判断如果num是0才可以签到
if (num == 0)
{
Record r = new Record();
r.id = dgvList.SelectedRows[0].Cells[0].Value.ToString();
r.name = dgvList.SelectedRows[0].Cells[1].Value.ToString();
r.SignInTime = DateTime.Now;
Record.relist.Add(r.name, r);
给你选中的type赋值一个1
w.type = 1;
MessageBox.Show("签到成功");
}
else
{
MessageBox.Show("您已经签到过了");
}
} private void 签退ToolStripMenuItem_Click(object sender, EventArgs e)
{
Worker w = new Worker();
foreach (Worker item in Worker.list)
{
if (item.Name == dgvList.SelectedCells[1].Value.ToString())
{
w = item;
break;
}
}
把你选中的type赋值给num
num = w.type;
如果num是1,才可以签退
if (num == 1)
{
foreach (string item in Record.relist.Keys)
{
if (item == dgvList.SelectedRows[0].Cells[1].Value.ToString())
{
Record.relist[dgvList.SelectedRows[0].Cells[1].Value.ToString()].SignOutTime = DateTime.Now;
w.type = 2;
MessageBox.Show("签退成功");
break;
}
}
}
如果是0证明没有签到
else if (num == 0)
{
MessageBox.Show("没有签到,无法签退"); }
否则已经签退过了
else
{ MessageBox.Show("您已经签退过了");
} //dgvList.AutoGenerateColumns = false;
//dgvList.DataSource = new BindingList<Worker>(Worker.list);
}

  

把员工的签到信息展示在DataGridView上

private void FrmThisd_Load(object sender, EventArgs e)
{
dgvList.AutoGenerateColumns = false;
BindingSource bs = new BindingSource();
bs.DataSource = Record.relist.Values;
dgvList.DataSource = bs; lbl1.Text = dgvList.RowCount.ToString();
}

  

 

 

  

 

 

用WinForm写的员工考勤项目!!!!!!的更多相关文章

  1. HR外包系统 - 员工项目 薪资项目 考勤项目 -管理

    项目管理-包括员工项目 薪资项目 考勤项目 一 后台总公司定义项目-前台分公司选择项目,定义别名-分公司客户选择员工项目,定义别名 分公司下面-新建薪资类别-薪资类别下面选择要的薪资和考勤项目. 二 ...

  2. 用C#Winform写个简单的批量清空文件内容和删除文件的小工具

    用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013 ...

  3. WinForm多语言版本实战项目演练

    一.课程介绍 关于如何实现“WinForm多语言版本”网上有很多实现技术方案,可以说是“琳琅满目”,"包罗万象".俗话说的好:一千个读者就有一千个哈姆雷特!如果您工作中恰好也遇到这 ...

  4. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享四:部署到阿里云

    框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 阿里云开放必要端口,mysql与t ...

  5. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享三:问题2

    框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 搜索框是该项目重要的一环,由于涉及 ...

  6. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享二:问题1

    框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 添加时,如果失败,不能正确跳转 c ...

  7. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍

    这次我尝试写一个原创的项目 the_game 框架选择: SpringBoot+Mybatisplus+Shiro 首先是简单的介绍(素材灵感来自英雄联盟) 5个关键的表: admin(管理员): l ...

  8. winform 写App.config配置文件——IT轮子系列(八)

    前言 在winform项目中,常常需要读app.config文件.如: var version = System.Configuration.ConfigurationManager.AppSetti ...

  9. 手写Maven的archetype项目脚手架

    一.背景 maven是一个很好的代码构建工具,采用“约定优先于配置”的原则进行项目管理,相信很多的java开发者应该都了解maven并可能在工作当中都是通过maven来管理项目的,在创建的项目的时候, ...

随机推荐

  1. DX系列之TreeList

    参考资料: DevXpress控件: 第三篇: 将 父子 关系进行到底

  2. IIS7错误“Web服务器被配置为不列出此目录的内容”的解决办法

    *打开 Internet 信息服务(IIS)管理器 - 目录浏览 选择启用即可.

  3. beaglebone black 固定IP上网(ubuntu16.04,console)

    今天把beaglebone black搞了下,让能通过网线上网.需要修改一些文件.刷的是ubuntu16.04系统,没有界面.不过资源占用很少,顺便说一下.系统下的vi不好用,没有安装vim. 下面的 ...

  4. FFmpeg-for IOS 一[安装]

    FFmpeg编译环境搭建 准备 下载 gas-preprocessor 下载 ffmpeg包,ffmpeg 安装yasm,先安装homebrew,输入:ruby -e "$(curl -fs ...

  5. [转]socket 通俗解释

    socket是网络编程的基础,本文用打电话来类比socket通信中建立TCP连接的过程.    socket函数,表示你买了或者借了一部手机.    bind函数,告诉别人你的手机号码,让他们给你打电 ...

  6. python多种格式数据加载、处理与存储

    多种格式数据加载.处理与存储 实际的场景中,我们会在不同的地方遇到各种不同的数据格式(比如大家熟悉的csv与txt,比如网页HTML格式,比如XML格式),我们来一起看看python如何和这些格式的数 ...

  7. Struts2第一个入门案例

      一.如何获取Struts2,以及Struts2资源包的目录结构的了解    Struts的官方地址为http://struts.apache.org 在他的主页当中,我们可以通过左侧的Apache ...

  8. .NET中的异步

    .NET中4种异步方式? ThreadPool.QueueUserworkItem实现 APM模式(就是BeginXXX和EndXXX成对出现.) EAP模式(就是Event based, 准确说来就 ...

  9. zookeeper_service 出错 java.lang.NoClassDefFoundError: org/I0Itec/zkclient/exception/ZkNoNodeException

    2016-12-18 08:28:07 ContextLoader:358 ERROR - Context initialization failed java.lang.NoClassDefFoun ...

  10. 《转载》使用org.w3c.dom.Element的setTextContent()、getTextContent()方法时出现编译错误

    今天在更新项目后进行编译时,出现如下错误一堆: 编译错误 Google之,在stackoverflow上看到如下的解决方法: I came here with the same problem. Ev ...