嗨,据我了解,您希望在刷新树视图后保存树视图地图(通过添加新数据甚至删除一些数据),您希望展开所有展开的节点,而其他节点默认折叠。
解决办法是:
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);
}
}
}