扩大部门措施,员工存款和储蓄在相应的机构

——————————————————————部门局地——————————————————————————————–

有时在品种中大家会遇上这么的景观:

率先落到实处对根部门的增加和删除改查,那里要求二个treeview控件

 职员和工人部门大家一般都在数据Curry面存成树形结构,用的时候依据递归来加载整个机关的架构,员工存款和储蓄在相应的机构,假诺要获得有个别部门上边包车型客车职工的时候

机关,增添三个AddDeptDlg窗体,那里修改部门传值给子窗体笔者想到的有二种办法一,定义一个公共类,在个中定义1个大局的静态变量用来存放在树节点。二,通太早先化构造函数字传送值给主窗体,小编用的是第贰种办法,实例代码如下:

,大家一般的做法是根据单位id
递归找到相应的树,然后记下部门的id,然后过滤找到职员和工人的列表。

图片 1图片 2

大家的做法是在表中添加2个path,该字段存的是种种节点绝对根节点的门路用|隔断,比如
TXCB|UTSD|JKDF,

 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         }

那正是说对上述的光景的时候我们借使找到要寻找的节点的path,然后用一条like
语句就很不难完结上述成效。

View Code

表结构

扩张部门措施,只要成功把数据音讯存款和储蓄到树节点中去就行了。由于要存款和储蓄的音信太多,所以只可以定义一个类存放对象的变量,再将对象的有着音信打包赋值给node的tag中。那里要尤其注意那么些tag很强劲的啊,弄透它能够做过多奇怪的事务。

图片 3图片 4View Code

 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("人下面不能加部门,请核实!");
                }
             }
         }
CREATE TABLE [dbo].[scs_sh_job](
    [Id] [int] IDENTITY(1,1) NOT NULL, --自增id
    [code] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL, 编码
    [father_jobId] [uniqueidentifier] NULL, 父id
    [father_job_name] [nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL, --父名称
    [job_id] [uniqueidentifier] NULL, -子id
    [job_name] [nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL, --子名称
    [job_path] [nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL, -- 父路径+“|”+ code
    [u_uid] [uniqueidentifier] NULL, --添加人id
    [u_uname] [char](10) COLLATE Chinese_PRC_CI_AS NULL, --添加人姓名
    [u_time] [datetime] NULL        --添加时间
) ON [DATA]

如上增添和修改部门用的同一个窗体,只是起先化窗体的构造函数分化而已,便于早先时期的爱慕。

  大家用treeview控件来演示:

删去部门就不多哔哔了,直接找到要删减的节点,判断是或不是存在子节点。不设有直接删掉,存在的话,提醒用户是不是全体剔除!

页面代码

——————————————————————-职员和工人部分———————————————————————————-

图片 5图片 6View Code

日增职员和工人同扩充部门类似,知识树节点存款和储蓄的消息多了一点而已,不多说,有注释应该都看得懂:

<div class="divContent">
<table width="70%">
<tr>
<td align="right">
选择职位:
</td>
<td align="left">
<asp:DropDownList ID="ddlJobName" runat="server" AutoPostBack="False" >
</asp:DropDownList>
</td>
<td>
<asp:Button ID="btnAddParent" runat="server" Text="添加父节点" 
CssClass="inputbuttonnormal" onclick="btnAddParent_Click" 
/>
</td>
<td class="style1">
<asp:Button ID="btnAddChild" runat="server" Text="添加叶子节点" 
CssClass="inputbuttonnormal" onclick="btnAddChild_Click"
/>
</td>
<td>
<asp:Button ID="btnSave" runat="server" Text="保存" CssClass="inputbuttonnormal" 
onclick="btnSave_Click" />
</td>
<td>
<asp:Button ID="btnDeleted" runat="server" Text="删除节点" CssClass="inputbuttonnormal" 
onclick="btnDeleted_Click" />
</td>
</tr>
<tr>
<td align="left">
<asp:TreeView ID="TvJobFilter" runat="server" ImageSet="Arrows" 
ShowLines="True">
<SelectedNodeStyle BorderColor="#000066" />
</asp:TreeView>
</td>
</tr>
</table>
</div>

图片 7图片 8

因为treeview  控件的节点包蕴音信较少,所以大家扩大了

 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赋对象的值
 [Serializable]
    public class CustomerTreeNode 
    {
        public int Id { get; set; }
        public string Code { get; set; }
        public string ParentJobId { get; set; }
        public string ParentJobName { get; set; }
        public string JobId { get; set; }
        public string JobName { get; set; }
        public string Path { get; set; }
    }

View Code

  生成code,也便是path 的基础数据

上边要用到了3个递归遍历节点的点子,那里也提供大家参考

 private static char[] constant =  
          {  
            '0','1','2','3','4','5','6','7','8','9',  
            'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',  
            'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'  
          };
        private static char[] constantNumber =  
          {  
            '0','1','2','3','4','5','6','7','8','9'  
          };

        public static string GenerateRandomNumber(int Length)
        {
            System.Text.StringBuilder newRandom = new System.Text.StringBuilder(62);
            Random rd = new Random();
            for (int i = 0; i < Length; i++)
            {
                newRandom.Append(constant[rd.Next(62)]);
            }
            return newRandom.ToString();
        }
 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         }

在始发的时候增进1个空的根节点,然后大家就足以经过添加“叶子节点”,“父节点”,“修改节点”,“”删除节点“作用来促成要的成效

修改职员和工人音讯,类似修改部门新闻,那里运用了将tag的值取出的措施,先new2个dep对象出来,dep=mode.tagas 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("所选节点不属于员工节点");
            }
        }

 选中要拉长的节点,大家要做的是插入一条新的笔录,更新选中节点及其子节点的path,从入选节点的code
替换到诚如节点的code+”|“+选中节点的code。

查看职员和工人新闻,用到一个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         }

剔除选中的节点,把选中节点的子的路径替换,从入选节点的path替换来path去掉删除节点的code

接下去要做的3个意义就是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);

            }
        }              

以上就是那个小玩意儿的侧重点,还有好多亟需校订的地点,也请各位大神看到了救助建议,非常多谢!前边还会更新数据库版本的,有时间也会记录。

相关文章