------------------------------------------------------------------部门部分--------------------------------------------------------------------------------------------
首先实现对根部门的增删改查,这里需要一个treeview控件
部门,增加一个AddDeptDlg窗体,这里修改部门传值给子窗体我想到的有两种方法1,定义一个公共类,在里面定义一个全局的静态变量用来存放树节点。2,通过初始化构造函数传值给主窗体,我用的是第二种方法,实例代码如下:
1 private void btnModDept_Click(object sender, EventArgs e) //修改部门 2 { 3 4 TreeNode node2 = twDeptList.SelectedNode; 5 if(node2==null) 6 { 7 MessageBox.Show("请选择要修改的部门"); 8 } 9 else 10 { 11 DeptClass Dep = new DeptClass(); 12 Dep = node2.Tag as DeptClass; 13 string v1 = Dep.DeptID; 14 string v2 = Dep.DeptName; 15 string v3 = Dep.ParentDeptID; 16 string v4 = Dep.ParentDeptName; 17 string v5 = Dep.Tips; 18 string v6 = Dep.DeptLev; 19 AddDeptDlg addDepart = new AddDeptDlg(v1, node2.Text, v3, v5, v4,v6); 20 if(addDepart.ShowDialog() == DialogResult.OK) 21 { 22 Dep.DeptName = addDepart.DeptName; 23 node2.Text = addDepart.DeptName; 24 Dep.DeptID = addDepart.DeptID; 25 Dep.ParentDeptName = addDepart.ParentDeptName; 26 Dep.ParentDeptID= addDepart.ParentDeptID; 27 Dep.Tips = addDepart.Ordertex; 28 twDeptList.SelectedNode = null; //使用后失去焦点事件 29 } 30 } 31 }
增加部门方法,只要做到把数据信息存储到树节点中去就行了。由于要存储的信息太多,所以只能定义一个类存放对象的变量,再将对象的所有信息封装赋值给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("人下面不能加部门,请核实!"); } } }
以上增加和修改部门用的同一个窗体,只是初始化窗体的构造函数不同罢了,便于后期的维护。
删除部门就不多哔哔了,直接找到要删除的节点,判断是否存在子节点。不存在直接删掉,存在的话,提示用户是否全部删除!
-------------------------------------------------------------------员工部分----------------------------------------------------------------------------------
增加员工同增加部门类似,知识树节点存储的信息多了一点而已,不多说,有注释应该都看得懂:
1 private void btnAddPer_Click(object sender, EventArgs e) //增加员工 2 { 3 TreeNode node = twDeptList.SelectedNode; 4 //MessageBox.Show(node.Tag.ToString()); 5 if (node== null) 6 { 7 MessageBox.Show("请先选择部门"); 8 } 9 else if(node!=null&& node.Name!="") 10 { 11 AddPerDlg addPerDlg = new AddPerDlg(node.Text); //将选定的部门名称传到新增窗口 12 if(addPerDlg.ShowDialog()==DialogResult.OK) 13 { 14 DeptClass PerObj = new DeptClass(); 15 PerObj.CardID = addPerDlg.CardID; 16 PerObj.EnterDate = addPerDlg.EnterDate; 17 PerObj.Navite = addPerDlg.Navite; 18 PerObj.PersonName = addPerDlg.PersonName; 19 PerObj.WorkID = addPerDlg.WorkID; 20 PerObj.DeptName = node.Text; 21 PerObj.PerBirth = addPerDlg.PersonBirth; 22 TreeNode node3 = node.Nodes.Add(PerObj.PersonName.Trim()); //新增的成员节点 23 node3.Tag = PerObj;//给这个成员节点的Tag赋对象的值
上面要用到了一个递归遍历节点的方法,这里也提供大家参考
1 private TreeNode FindNode(TreeNodeCollection Nodes, string NodeID)//遍历节点 2 { 3 TreeNode tnRet = null; 4 foreach (TreeNode Node in Nodes) 5 { 6 7 if (Node.Text == NodeID) 8 { 9 //找到了则退出 10 return Node; 11 } 12 if (Node.Nodes != null && Node.Nodes.Count > 0) 13 { 14 tnRet = FindNode(Node.Nodes, NodeID); 15 } 16 } 17 return tnRet; 18 }
修改员工信息,类似修改部门信息,这里用到了将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 = 150; } ReadChildNodeList(DeptClass.Selectednode, listPerView);//读取所有子节点 }
递归遍历,将节点的信息输出: 1 private void ReadChildNodeList(TreeNode parent, ListView listView) 2 { 3 foreach (TreeNode node in parent.Nodes) 4 { 5 DeptClass obj = new DeptClass(); 6 obj = node.Tag as DeptClass; 7 ListViewItem item; 8 item=listView.Items.Add(node.Text.ToString()); 9 item.SubItems.Add(obj.WorkID); 10 item.SubItems.Add(obj.PerBirth); 11 item.SubItems.Add(obj.CardID); 12 item.SubItems.Add(obj.Navite); 13 item.SubItems.Add(obj.DeptName); 14 item.SubItems.Add(obj.EnterDate); 15 ReadChildNodeList(node, listView); 16 } 17 }
接下来要做的一个功能就是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; if(twDeptList.Nodes.Count!=0) { 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); } }
以上就是这个小玩意的主体,还有许多需要改进的地方,也请各位大神看到了帮忙指出,万分感谢!后面还会更新数据库版本的,有时间也会记录。