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


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

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

0.最初的父節點建立
ParentNode = tv_user.Nodes.Add(OUname);
tv_user.CheckBoxes = true; //表示節點可以進行選中/取消選中操作
1
2
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());
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
下面是實現節點選中聯動的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);
}
}
}
————————————————
版權聲明:本文為CSDN博主「heivy」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/heivy/article/details/53507257


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM