1. 程式人生 > >C# TreeView 建立、遍歷樹(遞迴)

C# TreeView 建立、遍歷樹(遞迴)

剛接觸treeview這個功能,惡補了幾天,博主總結下實現的功能以備用,希望能幫到需要的親~~

C#gui程式中建立樹狀結構、遍歷樹狀結構、樹狀結構節點選中聯動(選中父節點時,自動選中其全部子節點,取消選中的某子節點,取消其相應的所有父節點的選中),讀取選中節點資訊。

0.最初的父節點建立

ParentNode = tv_user.Nodes.Add(OUname);
tv_user.CheckBoxes = true; //表示節點可以進行選中/取消選中操作

1、增加樹的子節點

寫了一個函式,(遞迴呼叫)實現無限級樹結構
此程式碼是用於遍歷AD域,然後輸出某部門的樹狀組織結構

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

參考: