Winform TreeView节点保存与恢复,真正能做到状态恢复。

前提:

1、NuGet安装Newtonsoft.Json。

2、添加TreeView控件,控件名称改为:Tre_Mian

新建类,名称为:TreeNodeStateHelper

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;

public class TreeNodeStateHelper
{
    public string SaveFilePath { get; set; }

    public TreeNodeStateHelper(string saveFilePath)
    {
        SaveFilePath = saveFilePath;
    }

    public class TreeNodeState
    {
        public string Text { get; set; }
        public List<TreeNodeState> Children { get; set; } = new List<TreeNodeState>();
        public bool IsExpanded { get; set; }
        public bool IsSelected { get; set; }
    }

    public void SaveTreeState(TreeView treeView)
    {
        var rootStates = treeView.Nodes.Cast<TreeNode>().Select(SerializeNode).ToList();
        File.WriteAllText(SaveFilePath, JsonConvert.SerializeObject(rootStates, Formatting.Indented));
    }

    public void LoadTreeState(TreeView treeView)
    {
        if (!File.Exists(SaveFilePath)) return;

        try
        {
            var json = File.ReadAllText(SaveFilePath);
            var rootStates = JsonConvert.DeserializeObject<List<TreeNodeState>>(json);

            treeView.BeginUpdate();
            treeView.Nodes.Clear();
            treeView.Nodes.AddRange(rootStates.Select(DeserializeNode).ToArray());
            treeView.EndUpdate();
        }
        catch (Exception ex)
        {
            MessageBox.Show($"状态加载失败: {ex.Message}");
        }
    }

    private TreeNodeState SerializeNode(TreeNode node)
    {
        return new TreeNodeState
        {
            Text = node.Text,
            IsExpanded = node.IsExpanded,
            IsSelected = node.IsSelected,
            Children = node.Nodes.Cast<TreeNode>().Select(SerializeNode).ToList()
        };
    }

    private TreeNode DeserializeNode(TreeNodeState state)
    {
        var node = new TreeNode(state.Text);

        if (state.IsExpanded)
            node.Expand();
        else
            node.Collapse();

        node.Nodes.AddRange(state.Children.Select(DeserializeNode).ToArray());
        return node;
    }
}

调用:

步骤1:声明

// 在Form类中声明
private TreeNodeStateHelper _treeStateHelper;

步骤2:创建对象

public Form1()
        {
            InitializeComponent();
            //创建对象
            _treeStateHelper = new TreeNodeStateHelper("tree_state.json");
        }

步骤3:保存于恢复

private void Form1_Load(object sender, EventArgs e)
        {
            _treeStateHelper.LoadTreeState(Tre_Main);//恢复展开的节点
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            _treeStateHelper.SaveTreeState(Tre_Main);//保存展开的节点
        }

 

posted @ 2025-04-12 10:14  Cmale  阅读(30)  评论(0)    收藏  举报