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