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

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

好了开始说项目需求: 实现新增员工;使用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. Unity游戏开发中的内存管理_资料

    内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...

  2. Placeholder在IE8的兼容问题

    <script type="text/javascript"> if( !('placeholder' in document.createElement('input ...

  3. 【12-26】go.js

    var $ = go.GraphObject.make; // for conciseness in defining templates function buildAlarm(row,column ...

  4. 10个最常见的 HTML5 面试题及答案

    这是选择了10个 HTML5 面试问题并给出了答案.这是 Web 开发人员最常见的面试问题,相信你掌握了这些重要的面试问题后一定会觉得你的理解提高了.一起来看看吧. 您可能感兴趣的相关文章 Web 前 ...

  5. leetcode--Maximum Subarray

    题目链接:https://leetcode.com/problems/maximum-subarray/ 算法类型:动态规划 题目分析:最大序列和 代码实现: class Solution(objec ...

  6. [Objective-c开源库]HHRouter

    ---恢复内容开始--- 目的 统一客户端内部和外部跳转处理,支持传参数 代码 添加vc,block映射 针对路径做映射,如/user/:userId -> UserViewController ...

  7. ueditor 1.4.3 gbk asp 上传中文乱码 终极解决方法 ie6 ie8 也适用

    [摘要:百度编纂器1.43 gbk asp 题目 1.firefox3.0下 单图上传 面没有了 面多图上传 中央的蓝色按钮(即 面击挑选图片)没有表现(附件上传出那个题目) 没有晓得我的水狐吃翔了 ...

  8. java防止表单重复提交

    用session防止表单重复提交 思路:在服务器端生成一个唯一的随机标识串Token,同时在当前用户的Session域中保存这个Token.然后将Token发送到客户端的Form表单中,在Form表单 ...

  9. 微信的audio无法自动播放的问题

    一.问题 最近做了一个html5的项目,里面涉及到音乐播放,项目要求音乐进入页面就自动播放,于是我就想到了html5的audio标签,将mp3引入进去. 1.在audio标签里引入了autoplay属 ...

  10. bootstrap validate 实现页面动态验证(formvalidate)

    关于基本的bootstrap validate 验证方法外面有许多博客上都有讲解,我就不在过多叙述了.大家也可以去看官网api:http://bv.doc.javake.cn/api/ 今天要说的是动 ...