zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    自旋锁和互斥锁区别
    NFS挂载Android文件系统
    查找文件命令
    make menuconfig出错解决方法
    专访Linux嵌入式开发韦东山操作系统图书作者--转
    Ubuntu进不入系统,一直停留在ubuntu图标画面(转)
    查看驱动打印信息
    aiku给你们最真心地学习建议--转
    SZ,RZ传送文件
    在Android下运行Linux平台编译的程序
  • 原文地址:https://www.cnblogs.com/ljs-13/p/12109126.html
Copyright © 2011-2022 走看看