C# TreeView 建立、遍历树(递归)

版权声明:本博客系博主原创或转载,允许转载,但请保留原文出处。 https://blog.csdn.net/heivy/article/details/53507257

刚接触treeview这个功能,恶补了几天,博主总结下实现的功能以备用,希望能帮到需要的亲~~

C#gui程序中建立树状结构、遍历树状结构、树状结构节点选中联动(选中父节点时,自动选中其全部子节点,取消选中的某子节点,取消其相应的所有父节点的选中),读取选中节点信息。

0.最初的父节点建立

ParentNode = tv_user.Nodes.Add(OUname);
tv_user.CheckBoxes = true; //表示节点可以进行选中/取消选中操作

1、增加树的子节点

写了一个函数,(递归调用)实现无限级树结构
此代码是用于遍历AD域,然后输出某部门的树状组织结构

关于AD域请参考上篇文章:http://blog.csdn.net/heivy/article/details/53505916

ouName :是某部门名称

 public void AddTree(TreeNode pNode, string ouName, DirectoryEntry objDE)
        {
            TreeNode pnode = pNode, cnode;

            DirectorySearcher objSearch = new DirectorySearcher(objDE);
            objSearch.Filter = "(&(objectClass=organizationalUnit)(ou=" + ouName + "))";
            SearchResult objsearchResult = objSearch.FindOne();
            DirectoryEntry objEntry = objsearchResult.GetDirectoryEntry();

            foreach (DirectoryEntry entry in objEntry.Children)
            {
            //如果节点是组织单元(即部门)(即存在子节点),则调用函数AddTree()
                if (entry.SchemaClassName.Equals("organizationalUnit"))
                {
                    cnode = pnode.Nodes.Add(entry.Properties["name"][0].ToString());

                    AddTree(cnode, entry.Properties["name"][0].ToString(), objDE);
                }
                //如果节点是群组(即存在子节点),则调用函数AddTree()
                else if (entry.SchemaClassName.Equals("group"))
                {
                    cnode = pnode.Nodes.Add(entry.Properties["name"][0].ToString());

                    int count = entry.Properties["member"].Count;

                    string memberName = "";
                    for (int i = 1; i < count; i++)
                    {
                        string tmpName = entry.Properties["member"][i].ToString();
                        memberName = tmpName.Split(',')[0].Split('=')[1].ToString();
                        cnode.Nodes.Add(memberName);
                    }
                }
                else
                {
                    cnode = pnode.Nodes.Add(entry.Properties["name"][0].ToString());
                }
            }
        }

2.遍历树(读取被选中节点的信息)

public List<string> CheckedNodes(TreeNode parent, List<string> checkednodes)
        {

            TreeNode node = parent;
            if (node != null)
            {
                if (node.Checked == true && node.FirstNode == null)
                    checkednodes.Add(node.Text);

                if (node.FirstNode != null)////如果node节点还有子节点则进入遍历
                {
                    CheckedNodes(node.FirstNode, checkednodes);
                }
                if (node.NextNode != null)////如果node节点后面有同级节点则进入遍历
                {
                    CheckedNodes(node.NextNode, checkednodes);
                }
            }

            return checkednodes;
        }

3、节点选中联动功能

在treeview_AfterCheck 事件中调用下面2个函数,如:

if (e.Action == TreeViewAction.ByMouse)
            {
                // textBox1.Text = e.Node.Text;
                if (e.Node.Checked == true)
                {
                    //选中节点之后,选中该节点所有的子节点
                    setChildNodeCheckedState(e.Node, true);

                }
                else if (e.Node.Checked == false)
                {
                    //取消节点选中状态之后,取消该节点所有子节点选中状态
                    setChildNodeCheckedState(e.Node, false);
                    //如果节点存在父节点,取消父节点的选中状态
                    if (e.Node.Parent != null)
                    {
                        setParentNodeCheckedState(e.Node, false);
                    }
                }
            }

下面是实现节点选中联动的2个子函数:

    //取消节点选中状态之后,取消所有父节点的选中状态
        public void setParentNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNode parentNode = currNode.Parent;
            parentNode.Checked = state;
            if (currNode.Parent.Parent != null)
            {
                setParentNodeCheckedState(currNode.Parent, state);
            }
        }
        //选中节点之后,选中节点的所有子节点
        public void setChildNodeCheckedState(TreeNode currNode, bool state)
        {
            TreeNodeCollection nodes = currNode.Nodes;
            if (nodes.Count > 0)
            {
                foreach (TreeNode tn in nodes)
                {
                    tn.Checked = state;
                    setChildNodeCheckedState(tn, state);
                }
            }
        }

参考:

本文出自he ivy 的博客,转载请注明出处:http://blog.csdn.net/heivy/article/details/53507257

猜你喜欢

转载自blog.csdn.net/heivy/article/details/53507257