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);//保存展开的节点 }

浙公网安备 33010602011771号