C#树形结构的保存与加载
添加控件:
treeView1 命名 myTreeView
1. 保存上次点击的节点
保存用户最后点击的节点路径(从根节点到目标节点的完整路径),可以使用节点的FullPath属性。
2. 恢复节点状态
在软件启动时,根据保存的节点路径找到对应的节点,并展开到该节点。
实现代码
保存所有展开节点的路径
public void SaveExpandedNodes(TreeView treeView, string filePath) { List<string> expandedNodePaths = new List<string>(); // 遍历所有节点,记录展开节点的路径 foreach (TreeNode node in treeView.Nodes) { SaveExpandedNodesRecursive(node, expandedNodePaths); } // 将路径列表保存到文件 File.WriteAllLines(filePath, expandedNodePaths); } private void SaveExpandedNodesRecursive(TreeNode node, List<string> expandedNodePaths) { if (node.IsExpanded) { // 记录展开节点的路径 expandedNodePaths.Add(node.FullPath); } // 递归遍历子节点 foreach (TreeNode childNode in node.Nodes) { SaveExpandedNodesRecursive(childNode, expandedNodePaths); } }
恢复所有展开节点的状态
public void RestoreExpandedNodes(TreeView treeView, string filePath) { if (File.Exists(filePath)) { // 读取保存的节点路径 string[] expandedNodePaths = File.ReadAllLines(filePath); // 遍历路径列表,展开对应的节点 foreach (string path in expandedNodePaths) { TreeNode node = FindNodeByPath(treeView.Nodes, path); if (node != null) { node.Expand(); } } } } private TreeNode FindNodeByPath(TreeNodeCollection nodes, string path) { foreach (TreeNode node in nodes) { if (node.FullPath == path) { return node; } // 递归查找子节点 TreeNode foundNode = FindNodeByPath(node.Nodes, path); if (foundNode != null) { return foundNode; } } return null; }
使用示例
保存节点状态
调用控件的AfterSelect事件:
private void myTreeView_AfterSelect(object sender, TreeViewEventArgs e) { SaveLastClickedNode(myTreeView, "lastNodePath.txt"); }
调用控件的双击事件:
private void myTreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { SaveExpandedNodes(myTreeView, "expandedNodes.txt"); }
调用控件的单击事件:
private void myTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { SaveExpandedNodes(myTreeView, "expandedNodes.txt"); }
恢复节点状态
在软件启动时(如Form_Load事件),调用恢复方法:
private void Form1_Load(object sender, EventArgs e) { RestoreExpandedNodes(myTreeView, "expandedNodes.txt"); }

浙公网安备 33010602011771号