ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-27 18:55:23  阅读:262  来源: 互联网

标签:node Node 遍历 TreeNode C# 选中 entry 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

标签:node,Node,遍历,TreeNode,C#,选中,entry,TreeView,节点
来源: https://www.cnblogs.com/ljs-13/p/12109126.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有