教你做一个单机版人事管理系统(Winform版)treeview与listview使用详情
------------------------------------------------------------------部门部分--------------------------------------------------------------------------------------------
首先实现对根部门的增删改查,这里需要一个treeview控件
部门,增加一个AddDeptDlg窗体,这里修改部门传值给子窗体我想到的有两种方法1,定义一个公共类,在里面定义一个全局的静态变量用来存放树节点。2,通过初始化构造函数传值给主窗体,我用的是第二种方法,实例代码如下:
private void btnModDept_Click(object sender, EventArgs e) //修改部门
{
TreeNode node2 = twDeptList.SelectedNode;
if(node2==null)
{
MessageBox.Show("请选择要修改的部门");
}
else
{
DeptClass Dep = new DeptClass();
Dep = node2.Tag as DeptClass;
string v1 = Dep.DeptID;
string v2 = Dep.DeptName;
string v3 = Dep.ParentDeptID;
string v4 = Dep.ParentDeptName;
string v5 = Dep.Tips;
string v6 = Dep.DeptLev;
AddDeptDlg addDepart = new AddDeptDlg(v1, node2.Text, v3, v5, v4,v6);
if(addDepart.ShowDialog() == DialogResult.OK)
{
Dep.DeptName = addDepart.DeptName;
node2.Text = addDepart.DeptName;
Dep.DeptID = addDepart.DeptID;
Dep.ParentDeptName = addDepart.ParentDeptName;
Dep.ParentDeptID= addDepart.ParentDeptID;
Dep.Tips = addDepart.Ordertex;
twDeptList.SelectedNode = null; //使用后失去焦点事件
}
}
}
private void btnAddDept_Click(object sender, EventArgs e) //增加部门
{
AddDeptDlg addDepart = new AddDeptDlg();
if(addDepart.ShowDialog()==DialogResult.OK)
{
DeptClass DeptObj = new DeptClass();
DeptObj.DeptID = addDepart.DeptID;
DeptObj.DeptName = addDepart.DeptName;
DeptObj.ParentDeptID = addDepart.ParentDeptID;
DeptObj.ParentDeptName = addDepart.ParentDeptName;
DeptObj.DeptLev = addDepart.Deptlev;
DeptObj.Tips = addDepart.Ordertex;
//定义选择的部门节点为node2
TreeNode node2= twDeptList.SelectedNode;
// DeptClass.Node = node2.ToString();
if (node2 == null) //没有选择部门
{
//上级部门为空
if (DeptObj.ParentDeptID == "" && DeptObj.ParentDeptName == "" && DeptObj.DeptLev != "")
{
//直接增加根部门节点
TreeNode node = twDeptList.Nodes.Add
(DeptObj.DeptName.Trim());
node.Name = DeptObj.DeptLev;
node.Tag = DeptObj;
twDeptList.SelectedNode = null;
}
else
{
//根据填写的上级部门遍历所有节点,node3为遍历返回的节点值
TreeNode node3 = FindNodeByText(twDeptList.Nodes, DeptObj.ParentDeptName);
//如果存在要找的上级部门,在其部门下增加新的子部门
if (node3 != null)
{
node3.Nodes.Add(DeptObj.DeptName.Trim());
node3.Name = DeptObj.DeptLev;
node3.Tag = DeptObj;
twDeptList.SelectedNode = null;
}
else
{
MessageBox.Show("未找到输入的上级部门");
MessageBox.Show("未找到输入的上级部门");
MessageBox.Show("未找到输入的上级部门");
//TreeNode node = twDeptList.Nodes.Add
//(DeptObj.ParentDeptID.Trim(), DeptObj.ParentDeptName.Trim(), DeptObj.ParentDeptID.Trim());
//TreeNode node5=node.Nodes.Add(DeptObj.DeptID.Trim(), DeptObj.DeptName.Trim(), DeptObj.DeptID.Trim());
////node.Name = DeptObj.DeptID.Trim();
//node5.Tag = DeptObj;
//twDeptList.SelectedNode = null;
}
//待修改,上级部门不存在不让添加!!!
}
}
else if (node2.Name != "" && node2 != null) //选择了部门
{
TreeNode node3 = node2.Nodes.Add(DeptObj.DeptName.Trim());
//把所选节点的部门信息加到要新增的节点的上级部门信息里面
DeptClass Dep = new DeptClass();
Dep = node2.Tag as DeptClass;
string v1 = Dep.DeptName;
string v2 = Dep.DeptID;
DeptClass DeptObj2 = new DeptClass();
DeptObj2.DeptID = addDepart.DeptID;
DeptObj2.DeptName = addDepart.DeptName;
DeptObj2.ParentDeptID = v2;
DeptObj2.ParentDeptName = v1;
DeptObj2.DeptLev = addDepart.Deptlev;
DeptObj2.Tips = addDepart.Ordertex;
node3.Tag = DeptObj2;
node3.Name = DeptObj2.DeptLev;
twDeptList.SelectedNode = null;
}
else
{
MessageBox.Show("人下面不能加部门,请核实!");
MessageBox.Show("人下面不能加部门,请核实!");
MessageBox.Show("人下面不能加部门,请核实!");
}
}
}
以上增加和修改部门用的同一个窗体,只是初始化窗体的构造函数不同罢了,便于后期的维护。
删除部门就不多哔哔了,直接找到要删除的节点,判断是否存在子节点。不存在直接删掉,存在的话,提示用户是否全部删除!
-------------------------------------------------------------------员工部分----------------------------------------------------------------------------------
增加员工同增加部门类似,知识树节点存储的信息多了一点而已,不多说,有注释应该都看得懂:
private void btnAddPer_Click(object sender, EventArgs e) //增加员工
{
TreeNode node = twDeptList.SelectedNode;
//MessageBox.Show(node.Tag.ToString());
if (node== null)
{
MessageBox.Show("请先选择部门");
}
else if(node!=null&& node.Name!="")
{
AddPerDlg addPerDlg = new AddPerDlg(node.Text); //将选定的部门名称传到新增窗口
if(addPerDlg.ShowDialog()==DialogResult.OK)
{
DeptClass PerObj = new DeptClass();
PerObj.CardID = addPerDlg.CardID;
PerObj.EnterDate = addPerDlg.EnterDate;
PerObj.Navite = addPerDlg.Navite;
PerObj.PersonName = addPerDlg.PersonName;
PerObj.WorkID = addPerDlg.WorkID;
PerObj.DeptName = node.Text;
PerObj.PerBirth = addPerDlg.PersonBirth;
TreeNode node3 = node.Nodes.Add(PerObj.PersonName.Trim()); //新增的成员节点
node3.Tag = PerObj;//给这个成员节点的Tag赋对象的值
上面要用到了一个递归遍历节点的方法,这里也提供大家参考
private TreeNode FindNode(TreeNodeCollection Nodes, string NodeID)//遍历节点
{
TreeNode tnRet = null;
foreach (TreeNode Node in Nodes)
{
if (Node.Text == NodeID)
{
//找到了则退出
return Node;
}
)
{
tnRet = FindNode(Node.Nodes, NodeID);
}
}
return tnRet;
}
修改员工信息,类似修改部门信息,这里用到了将tag的值取出的方法,先new一个dep对象出来,dep=mode.tag as DeptClass;后面就可以将mode.tag中的信息取出来,想怎么用怎么用啦:
private void btnModPer_Click(object sender, EventArgs e)//修改员工信息
{
TreeNode Modnode = twDeptList.SelectedNode;
if(Modnode==null)
{
MessageBox.Show("请选择要修改的员工");
}
else if(Modnode!=null&&Modnode.Name=="")
{
//常用方法:将对象的值传到node的tag属性中,实例化tag属性取出需要的值。
DeptClass Dep = new DeptClass();
Dep = Modnode.Tag as DeptClass;
string v1 = Dep.PerBirth;
string v2 = Dep.PersonName;
string v3 = Dep.WorkID;
string v4 = Dep.Navite;
string v5 = Dep.EnterDate;
string v6 = Dep.CardID;
AddPerDlg addPer = new AddPerDlg(Modnode.Parent.Text,v1,v2,v3,v4,v5,v6);
if(addPer.ShowDialog()==DialogResult.OK)
{
Dep.PersonName=addPer.PersonName;
Modnode.Text = addPer.PersonName;
Dep.PerBirth = addPer.PersonBirth;
Dep.WorkID = addPer.WorkID;
Dep.Navite = addPer.Navite;
Dep.EnterDate = addPer.EnterDate;
Dep.CardID= addPer.CardID;
}
}
else
{
MessageBox.Show("所选节点不属于员工节点");
}
}
查看员工信息,用到一个listview控件,将节点的详细信息显示在listview中,初始化listview窗体,先定义表头内容listview.Columns,随后填充表内的详细信息ReadChildNodeList方法:
private void InitializeListView()
{
listPerView.View = View.Details;
listPerView.OwnerDraw = true;
listPerView.GridLines = true;
listPerView.FullRowSelect = true;
listPerView.Columns.Add("姓名");
listPerView.Columns.Add("工号");
listPerView.Columns.Add("生日");
listPerView.Columns.Add("身份证号");
listPerView.Columns.Add("籍贯");
listPerView.Columns.Add("所属部门");
listPerView.Columns.Add("入场日期");
foreach (ColumnHeader Column in listPerView.Columns)
{
Column.TextAlign = HorizontalAlignment.Center;
Column.Width = ;
}
ReadChildNodeList(DeptClass.Selectednode, listPerView);//读取所有子节点
}
递归遍历,将节点的信息输出:
1 private void ReadChildNodeList(TreeNode parent, ListView listView) { foreach (TreeNode node in parent.Nodes) { DeptClass obj = new DeptClass(); obj = node.Tag as DeptClass; ListViewItem item; item=listView.Items.Add(node.Text.ToString()); item.SubItems.Add(obj.WorkID); item.SubItems.Add(obj.PerBirth); item.SubItems.Add(obj.CardID); item.SubItems.Add(obj.Navite); item.SubItems.Add(obj.DeptName); item.SubItems.Add(obj.EnterDate); ReadChildNodeList(node, listView); } }
接下来要做的一个功能就是txt文件导入导出树节点,或者xml文件的导入导出:
private void btnSavein_Click(object sender, EventArgs e) //XML格式导入
{
this.OpenFileDlg.ShowDialog(); //打开文件位置控件
string address = "";
address = this.OpenFileDlg.FileName;
try
{
doc.Load(address);
RecursionTreeControl(doc.DocumentElement, twDeptList.Nodes);
twDeptList.ExpandAll();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
//btnSavein.Dispose();
//btnSavein.Hide();
}
private void RecursionTreeControl(XmlNode xmlNode,TreeNodeCollection nodes)//将xml文件的内容显示在TreeView控件中
{
foreach(XmlNode node in xmlNode.ChildNodes)//循环遍历当前元素的子元素集合
{
TreeNode newChild = new TreeNode();//定义一个Treenode节点对象
DeptClass obj = new DeptClass();
obj.DeptLev = node.Attributes["Level"].Value;
obj.DeptName = node.Attributes["Text"].Value;
obj.DeptID = node.Attributes["ID"].Value;
obj.ParentDeptID = node.Attributes["ParentID"].Value;
obj.ParentDeptName = node.Attributes["ParentName"].Value;
obj.Tips = node.Attributes["Tips"].Value;
newChild.Tag = obj;
newChild.Name = node.Attributes["Level"].Value;
newChild.Text = node.Attributes["Text"].Value;
nodes.Add(newChild);//向当前TreeNodeCollection集合中添加当前节点
RecursionTreeControl(node,newChild.Nodes);
}
}
导出文件,详情看代码:
private void btnOut_Click(object sender, EventArgs e) //导出节点到XML文件
{
try
{
sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.Append("<Tree>");
//遍历节点
foreach(TreeNode node in twDeptList.Nodes)
{
xmlLine = GetRSSText(node);
sb.Append(xmlLine);
//遍历递归节点
parseNode(node, sb);
sb.Append("</Node>");
}
sb.Append("</Tree>");
string H = DateTime.Now.Hour.ToString(); //获取当前时间的时
string M = DateTime.Now.Minute.ToString();//获取当前时间的分
string S = DateTime.Now.Second.ToString();//获取当前时间的秒
string nameAdd = "TreeXml"+H+M+S;
)
{
StreamWriter sr = new StreamWriter(nameAdd, false, System.Text.Encoding.UTF8);
sr.Write(sb.ToString());
sr.Close();
MessageBox.Show("导出到"+nameAdd+"成功");
}
else
{
MessageBox.Show("空文件,导他干嘛");
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
以上就是这个小玩意的主体,还有许多需要改进的地方,也请各位大神看到了帮忙指出,万分感谢!后面还会更新数据库版本的,有时间也会记录。
教你做一个单机版人事管理系统(Winform版)treeview与listview使用详情的更多相关文章
- 3分钟教你做一个iphone手机浏览器
3分钟教你做一个iphone手机浏览器 第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebV ...
- R数据分析:跟随top期刊手把手教你做一个临床预测模型
临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...
- 【酷Q插件制作】教大家做一个简单的签到插件
酷Q插件已经有很多了,社区分享一大堆,不过还是自己写才有乐趣,哈哈.不得不吐槽一下,酷Q竟然不更新了,出了个酷Q pro,还收费!!诶.不过这也影响不了咱写插件的心情,今天教大家写一个酷Q签到插件,虽 ...
- TTS-零基础入门-10分钟教你做一个语音功能
在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话 CreateObject("SAPI.SpVoice").Spea ...
- 手把手教你做一个Shell命令窗口
这是一个类似于win下面的cmd打开后的窗口,可以跨平台使用,可以在win和linux下面同时使用,主要功能如下: 首先我们需要把这些功能的目录写出来,通过写一个死循环,让其每次回车之后都可以保持同样 ...
- Android应用系列:手把手教你做一个小米通讯录(附图附源码)
前言 最近心血来潮,突然想搞点仿制品玩玩,很不幸小米成为我苦逼的第一个试验品.既然雷布斯的MIUI挺受欢迎的(本人就是其的屌丝用户),所以就拿其中的一些小功能做一些小demo来玩玩.小米的通讯录大家估 ...
- [Material Design] 教你做一个Material风格、动画的button(MaterialButton)
原创作品,转载请注明出处:http://blog.csdn.net/qiujuer/article/details/39831451 前段时间Android L 公布了,相信看过公布会了解过的朋友都为 ...
- Vue+ElementUI: 手把手教你做一个audio组件
目的 本项目的目的是教你如何实现一个简单的音乐播放器(这并不难) 本项目并不是一个可以用于生产环境的element播放器,所以并没有考虑太多的兼容性问题 本项目不是ElementUI的一个音频插件,只 ...
- 教你做一个牛逼的DBA(在大数据下)
一.基本概念 大数据量下,搞mysql,以下概念需要先达成一致 1)单库,不多说了,就是一个库 2)分片(sharding),水平拆分,用于解决扩展性问题,按天拆分表 3)复制(replication ...
随机推荐
- java中File类应用:遍历文件夹下所有文件
练习: 要求指定文件夹下的所有文件,包括子文件夹下的文件 代码: package 遍历文件夹所有文件; import java.io.File; public class Test { public ...
- javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)
前言:本篇文章依赖四个jar包,其中javacv.jar,javacpp.jar和opencv.jar为固定jar包,opencv-系统环境.jar为选配(根据自己的系统平台,x64还是x86而定) ...
- spring-boot+mybatis开发实战:如何在spring-boot中使用myabtis持久层框架
前言: 本项目基于maven构建,使用mybatis-spring-boot作为spring-boot项目的持久层框架 spring-boot中使用mybatis持久层框架与原spring项目使用方式 ...
- 在Caffe添加Python layer详细步骤
本文主要讨论的是在caffe中添加python layer的一般流程,自己设计的test_python_layer.py层只是起到演示作用,没有实际的功能. 1) Python layer 在caff ...
- Tenacity——Exception Retry 从此无比简单
Python 装饰器装饰类中的方法这篇文章,使用了装饰器来捕获代码异常.这种方式可以让代码变得更加简洁和Pythonic. 在写代码的过程中,处理异常并重试是一个非常常见的需求.但是如何把捕获异常并重 ...
- 通过LOGBACK实现每个类、包或自定义级别
项实现LOGBACK对每个包或者类或者通过自定义级别的方式实现自定义输出的日志进入制定的文件.查阅了很多资料,都没有找到行之有效的解决方案,直到看到了这篇文章http://www.360doc.com ...
- (cljs/run-at (->JSVM :browser) "语言基础")
前言 两年多前知道cljs的存在时十分兴奋,但因为工作中根本用不上,国内也没有专门的职位于是搁置了对其的探索.而近一两年来又刮起了函数式编程的风潮,恰逢有幸主理新项目的前端架构,于是引入Ramda. ...
- Linux find运行机制详解
本文目录: 1.1 find基本用法示例 1.2 find理论部分 1.2.1 expression-operators 1.2.2 expression-options 1.2.3 expressi ...
- Python 第八章笔记
第八章总结 8.5. heapq - 堆队列算法 有8个算法 方法 heappush heappop heappushpop heapreplace heapify merge nlargest ns ...
- vue实现标签云效果
闲扯两句 最近想给自己的博客上加上一个3D标签云的效果,用来表示自己博客文章的分组,网上找到了canvas实现的,还有a元素实现的解析3D标签云,我想让标签可以选择和点击,又不想在标签数量较多时操作a ...