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");
}

 

posted @ 2023-06-02 17:04  Cmale  阅读(384)  评论(0)    收藏  举报