我有一个包含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); } } }