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

摘要:
在刚刚接触了树视图之后,博客作者总结了几天来实现的功能,希望能够帮助所需的pro~~C#gui程序建立树结构,遍历树结构,选择树结构节点的链接,并读取所选节点信息=空)////如果节点节点有子节点,请通过{CheckedNodes;}If(node.NextNode!

刚接触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

免责声明:文章转载自《C# TreeView 建立、遍历树(递归)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VSCode注册关联自定义类型文件Linux及文件系统基本介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

浅谈javascript中的递归和闭包

递归和闭包作为js中很重要的一环,几乎在前端的面试中都会涉及,特别闭包。今天前端组的组长冷不丁的问了我一下,粗略的回答了一下,感觉不太满足,于是重新学习了一下,写下本篇。 在说这个两个概念之前,我们先回顾一下函数表达式。 function实际上是一种引用对象,和其他引用类型一样,都有属性和方法。定义函数有函数声明、函数表达式、以及构造函数 这里说一下前两种...

Unity Find 使用规则

Find 使用规则 在 Unity 项目开发的时候,我们可以通过代码Find 对象的名字从而获得指定的对象。Find 会遍历Hierarchy 视图里面的游戏对象,在找到第一个符合的对象的时候就会终止遍历。而通过实践可以发现,这种遍历是从底部开始到上面,而不是从顶部遍历到下面,这个在运用的时候很关键。 The Demo 创建5个 Cube,让它们的名字统一...

C# 里TreeView绑定数据库实现分类

view plaincopy to clipboardprint? //从数据库中读取数据 SqlConnectioncon=newSqlConnection("server=127.0.0.1\\sqlexpress;uid=sa;"); con.Open(); con.ChangeDatabase("STggggg");...

ORACLE 创建多个游标并嵌套循环

需求:每遍历游标2的记录时分别去遍历游标1的数据,并替换后插入临时表 CREATE OR REPLACE PROCEDURE TESTQ IS DownDictate VARCHAR2(200) DEFAULT ''; t_IsExist NUMBER:=0; use_DownDictate VARCHAR2(200) DEFAULT ''; BEGIN...

C#遍历指定文件夹中的所有文件及操作

C#遍历指定文件夹中的所有文件 DirectoryInfo TheFolder=new DirectoryInfo(folderFullName);//遍历文件夹foreach(DirectoryInfo NextFolder in TheFolder.GetDirectories())   this.listBox1.Items.Add(NextFold...

wpf 逻辑树与可视化树

XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性。在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树。逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性、事件、资源等)都有与逻辑树相关联的行为。例如,属性值有时会沿着树自动传递给子元素,而触发的事件可以自底向上或自顶向下遍历树。 与逻辑树类似的一个概念是可视树。可...