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

原文地址:https://www.cnblogs.com/ljs-13/p/12109126.html