当前位置: 首页 > 编程语言 > C#

如何获取树视图中所有展开的节点?分享

时间:2023-04-10 13:30:35 C#

如何获取树视图中所有展开的节点?我有一个包含TreeView的程序。除了根和根下的两个节点之外的所有节点都从数据库中加载。当用户向数据库中添加数据时,它必须自动添加到TreeView中。我可以通过清除所有节点、添加默认节点并将所有数据(包括新数据)添加到我的TreeView来成功完成此操作,但新TreeView的所有节点都已折叠。我们的客户希望保留所有扩展节点,但仍然添加他刚刚添加的新数据。有没有办法知道所有展开的节点并在折叠或刷新后再次展开?感谢你的回复。您好据我了解,您想在刷新树视图(通过添加新数据甚至删除一些数据)后保存树视图,您想展开所有展开的节点,而另一个默认折叠。解决方法是:1)刷新前保存展开的树视图节点2)刷新树视图数据(注意,如果要删除节点,也要将其从保存的列表中移除)3)保存前设置保存的树视图树视图(仅限扩展节点)->此代码查看树视图节点集并将扩展节点的名称保存在字符串列表中ListcollectExpandedNodes(TreeNodeCollectionNodes){foreach(TreeNodechecknodeinNodes){if(checknode.IsExpanded)_lst.Add(checknode.Name);如果(checknode.Nodes.Count>0)_lst.AddRange(collectExpandedNodes(checknode.Nodes));}返回_lst;现在您已经在列表中收集了展开的节点名称,并且想要获得树视图外观,您需要2个函数,一个按名称检索节点的函数和一个展开所选节点的函数,它的父节点如下所示:如果树节点集合中存在一个节点,该函数将检索指向所选节点名称的指针TreeNodeFindNodeByName(TreeNodeCollectionNodesCollection,stringName)//返回默认值foreach(TreeNodecheckNodeinNodesCollection){if(checkNode.Name==Name)//检查这个节点名是否正确elseif(checkNode.Nodes.Count>0)//节点有子节点{returnNode=FindNodeByName(checkNode.Nodes,Name);}if(returnNode!=null)//检查是否成立不继续和break{返回返回节点;}}//没有找到returnreturnNode;}并且这个函数展开节点及其父节点voidexpandNodePath(TreeNodenode){if(node==null)return;if(node.Level!=0)//检查是否不是root{node.Expand();expandNodePath(node.Parent);}else{node.Expand();//thisisroot}}这些函数的用法如下所示privatevoidbutton4_Click(objectsender,EventArgse){//保存扩展节点ExpandedNodes=collectExpandedNodes(treeView1.Nodes);//将树视图节点状态重置为折叠treeView1.CollapseAll();//恢复它if(ExpandedNodes.Count>0){TreeNodeIamExpandedNode;for(inti=0;i要展开所有节点,请使用以下代码treeView1.ExpandAll();要展开选定节点,请使用以下代码treeView1.SelectedNode.ExpandAll();对于展开代码下方的特定节点,请使用treeView1.Nodes[Index].Expand();要简单地扩展节点,您可以尝试以下代码privatevoidbutton1_Click(objectsender,EventArgse){treeView1.Nodes.Add(newTreeNode("NewNode",newTreeNode[2]{newTreeNode("Node1"),newTreeNode("Node2")}));treeView1.Nodes[1].Expand();}希望对你有帮助这很简单下面你可以看到我的递归版本://ListofstorageidsofexpandednodesListexpandedNodeIds=newList();//为我们的树调用递归乐趣CollectExpandedNodes(tree.Nodes);//为收集扩展节点ID进行递归乐趣node.Id);if(node.HasChildren)CollectExpandedNodes(node.Nodes);}}假设Nodename是唯一的。仅保存扩展状态privateListSaveTreeState(TreeNodeCollectionnodes){ListnodeStates=newList();foreach(节点中的TreeNode节点){if(node.IsExpanded)nodeStates.Add(node.Name);nodeStates.AddRange(SaveTreeState(node.Nodes));}返回(节点状态);}让treeview完成查找和恢复节点的工作if(NodeList.Length>0)//仅当重新加载后的节点有效NodeList[0].Expand();}}使用:ListStateList=SaveTreeState(treeView1.Nodes);...//重新加载RestoreTreeState(treeView1,StateList);我知道这篇文章很旧但是如果树很深,使用树的递归遍历可能不是一个好主意。由于我没有看到任何使用非递归方式的anwser,这里有一个解决方案可以在不影响性能的情况下扩展节点。publicstaticIEnumerableCollectExpandedNodes(thisTreeNodeAdvroot){Stacks=newStack();s.Push(root);while(s.Count>0){TreeNodeAdvn=s.Pop();如果(n.IsExpanded)yieldreturnn;foreach(varchildinn.Children.ToArray().Reverse()){s.Push(child);}}}要使用这个方法,你可以这样做:此扩展方法使用深度优先遍历和后序中的yield关键字来生成IEnumerable集合。以上就是C#学习教程:如何获取树视图中所有展开的节点?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: