您好,据我了解,您想在刷新树视图(通过添加新数据甚至删除一些数据)后保存树视图地图,您想要展开所有展开的节点,其他节点默认折叠。
解决方案是:
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;
}
现在您已在列表中收集了展开的节点名称,并且想要恢复树视图外观,您需要两个函数,一个是按名称检索节点的函数,另一个是展开所选节点及其父节点的函数,以下代码执行以下操作:
如果节点存在于树节点集合中,则此函数检索指向所选节点名称的指针
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);
}
}
}