------------------------------------------------------------------部门部分--------------------------------------------------------------------------------------------

首先实现对根部门的增删改查,这里需要一个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;  //使用后失去焦点事件
              }
            }
         }
增加部门方法,只要做到把数据信息存储到树节点中去就行了。由于要存储的信息太多,所以只能定义一个类存放对象的变量,再将对象的所有信息封装赋值给node的tag中。这里要特别注意这个tag很强大的哦,弄透它可以做很多意想不到的事情。
 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使用详情的更多相关文章

  1. 3分钟教你做一个iphone手机浏览器

    3分钟教你做一个iphone手机浏览器 第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebV ...

  2. R数据分析:跟随top期刊手把手教你做一个临床预测模型

    临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...

  3. 【酷Q插件制作】教大家做一个简单的签到插件

    酷Q插件已经有很多了,社区分享一大堆,不过还是自己写才有乐趣,哈哈.不得不吐槽一下,酷Q竟然不更新了,出了个酷Q pro,还收费!!诶.不过这也影响不了咱写插件的心情,今天教大家写一个酷Q签到插件,虽 ...

  4. TTS-零基础入门-10分钟教你做一个语音功能

    在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话  CreateObject("SAPI.SpVoice").Spea ...

  5. 手把手教你做一个Shell命令窗口

    这是一个类似于win下面的cmd打开后的窗口,可以跨平台使用,可以在win和linux下面同时使用,主要功能如下: 首先我们需要把这些功能的目录写出来,通过写一个死循环,让其每次回车之后都可以保持同样 ...

  6. Android应用系列:手把手教你做一个小米通讯录(附图附源码)

    前言 最近心血来潮,突然想搞点仿制品玩玩,很不幸小米成为我苦逼的第一个试验品.既然雷布斯的MIUI挺受欢迎的(本人就是其的屌丝用户),所以就拿其中的一些小功能做一些小demo来玩玩.小米的通讯录大家估 ...

  7. [Material Design] 教你做一个Material风格、动画的button(MaterialButton)

    原创作品,转载请注明出处:http://blog.csdn.net/qiujuer/article/details/39831451 前段时间Android L 公布了,相信看过公布会了解过的朋友都为 ...

  8. Vue+ElementUI: 手把手教你做一个audio组件

    目的 本项目的目的是教你如何实现一个简单的音乐播放器(这并不难) 本项目并不是一个可以用于生产环境的element播放器,所以并没有考虑太多的兼容性问题 本项目不是ElementUI的一个音频插件,只 ...

  9. 教你做一个牛逼的DBA(在大数据下)

    一.基本概念 大数据量下,搞mysql,以下概念需要先达成一致 1)单库,不多说了,就是一个库 2)分片(sharding),水平拆分,用于解决扩展性问题,按天拆分表 3)复制(replication ...

随机推荐

  1. javaSE_05Java中方法(函数)与重载、递归-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 2)右击在新标签中打开放大查看

  2. js创建对象的多种方式及优缺点

    在js中,如果你想输入一个的信息,例如姓名,性别,年龄等,如果你用值类型来存储的话,那么你就必须要声明很多个变量才行,变量声明的多了的话,就会造成变量污染.所以最好的方式就是存储到对象中.下面能我就给 ...

  3. HTML面试题

    1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? 所谓的“浏览器内核”无非指的是一个浏览器最核心的部分-“Rendering Engine”,直译叫做“渲染引擎”,我们也常称为“排版引擎 ...

  4. Javascript中的数组去重-indexof方法

    在Javascript中,有时我们会用到数组去重.我在这里给大家介绍一下本人认为最简单实用的一种方法-indexOf()去重. var arr = [1,1,1,2,2,2,3,3,4,5,6,2,1 ...

  5. Android 图片加载框架Glide4.0源码完全解析(一)

    写在之前 上一篇博文写的是Picasso基本使用和源码完全解析,Picasso的源码阅读起来还是很顺畅的,然后就想到Glide框架,网上大家也都推荐使用这个框架用来加载图片,正好我目前的写作目标也是分 ...

  6. ajax、PHP、session做购物车

    购物车网页代码 1.登录界面login.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  7. ZooKeeper源码分析-Jute-第二部分

    数据类型和流 本部分描述支持Hadoop的基础数据类型以及复合类型.我们的目的是支持一系列的类型,可以用于在不同的编程语言中简化和有效表达一定范围的记录类型. 基础类型 大部分情况下,Hadoop的大 ...

  8. 关于MATLAB处理大数据坐标文件201761

    前几天备战考试,接下来的日子将会继续攻克大数据比赛 虽然停止了一段时间没有提交数据,但是这几天的收获还是有的,对Python 随机森林了解的更了解了 随机森林是由多课决策树组成(当然这个虽然我们初学者 ...

  9. nginx是什么nginx安装与配置之windows版

    1.nginx是什么 为了快速了解nginx我们先引用网上的nginx介绍: Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP ...

  10. 谈谈Nancy中让人又爱又恨的Diagnostics【上篇】

    前言 在Nancy中有个十分不错的功能-Diagnostics,可以说这个功能让人又爱又恨. 或许我们都做过下面这样的一些尝试: 记录某一个功能用到的相关技术信息 记录下网站的访问记录 全局配置某些框 ...