加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在树视图中获取所有扩展节点?

发布时间:2020-12-15 17:47:40 所属栏目:百科 来源:网络整理
导读:我有一个包含TreeView的程序.除根之外的所有节点和根目录下的两个节点都是从数据库加载的. 当用户将数据添加到数据库时,它必须自动添加到TreeView中.我可以通过清除所有节点,添加默认节点并将包括新数据在内的所有数据添加到我的TreeView中来成功完成此操作,
我有一个包含TreeView的程序.除根之外的所有节点和根目录下的两个节点都是从数据库加载的.

当用户将数据添加到数据库时,它必须自动添加到TreeView中.我可以通过清除所有节点,添加默认节点并将包括新数据在内的所有数据添加到我的TreeView中来成功完成此操作,但新TreeView的所有节点都已折叠.

我们的客户希望保留所有扩展节点,但仍然添加他刚刚添加的新数据.有没有办法知道所有扩展节点并在折叠或刷新后再次展开?谢谢你的回复.

解决方法

嗨据我了解,您希望在刷新树视图后保存树视图(通过添加新数据甚至删除一些),您希望展开所有展开的节点,另一个是默认折叠的.
解决方案是:

1)在刷新之前保存扩展的树视图节点

2)刷新树视图数据(注意,如果要删除节点,也要将其从保存的列表中删除)

3)设置之前保存的树视图

保存树视图(仅扩展节点) – >
此代码查看树视图节点集合并将扩展节点名称保存在字符串列表中

List<string> collectExpandedNodes(TreeNodeCollection Nodes)
        {
            List<string> _lst = new List<string>();
            foreach (TreeNode checknode in Nodes)
            {
                if (checknode.IsExpanded)
                    _lst.Add(checknode.Name);
                if (checknode.Nodes.Count > 0)
                    _lst.AddRange(collectExpandedNodes(checknode.Nodes));
            }
            return _lst;
        }

现在您已经在列表中收集了扩展节点名称,并且您希望获得树视图外观,您需要2个函数,一个函数通过名称和扩展所选节点的函数检索节点,它的父节点如下:

如果树节点集合中存在节点,则此函数将检索指向所选节点名称的指针

TreeNode FindNodeByName(TreeNodeCollection NodesCollection,string Name)
        {
          TreeNode returnNode = null; // Default value to return
          foreach (TreeNode checkNode in NodesCollection)
            {
                if (checkNode.Name == Name)  //checks if this node name is correct
                    returnNode = checkNode;
                else if (checkNode.Nodes.Count > 0 ) //node has child
                {
                    returnNode = FindNodeByName(checkNode.Nodes,Name);
                }

              if (returnNode != null) //check if founded do not continue and break
              {
                  return returnNode;
              }

            }
            //not found
            return returnNode;
        }

和此函数展开节点及其父节点

void expandNodePath(TreeNode node)
        {
            if (node == null)
                return;
            if (node.Level != 0) //check if it is not root
            {
                node.Expand();
                expandNodePath(node.Parent);
            }
            else
            {
                node.Expand(); // this is root 
            }

        }

以下显示了这些功能的用法

private void button4_Click(object sender,EventArgs e)
        {
            //saving expanded nodes
            List<string> ExpandedNodes = new List<string>();
            ExpandedNodes = collectExpandedNodes(treeView1.Nodes);
            //resetting tree view nodes status to colapsed
            treeView1.CollapseAll();

            //Restore it back
            if (ExpandedNodes.Count > 0)
            {
                TreeNode IamExpandedNode;
                for (int i = 0; i < ExpandedNodes.Count;i++ )
                {
                    IamExpandedNode = FindNodeByName(treeView1.Nodes,ExpandedNodes[i]);
                    expandNodePath(IamExpandedNode);
                }

            }

        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读