1. 程式人生 > >教你做一個單機版人事管理系統(Winform版)treeview與listview使用詳情

教你做一個單機版人事管理系統(Winform版)treeview與listview使用詳情

不讓 ogr lena 位置 exc bject tel horizon raw

------------------------------------------------------------------部門部分--------------------------------------------------------------------------------------------

首先實現對根部門的增刪改查,這裏需要一個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 }
View Code 增加部門方法,只要做到把數據信息存儲到樹節點中去就行了。由於要存儲的信息太多,所以只能定義一個類存放對象的變量,再將對象的所有信息封裝賦值給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賦對象的值
View Code

上面要用到了一個遞歸遍歷節點的方法,這裏也提供大家參考

 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);

            }
        }              

以上就是這個小玩意的主體,還有許多需要改進的地方,也請各位大神看到了幫忙指出,萬分感謝!後面還會更新數據庫版本的,有時間也會記錄。

教你做一個單機版人事管理系統(Winform版)treeview與listview使用詳情