首页 > 解决方案 > 使用 TreeNode 作为用户设置

问题描述

我正在尝试使用 TreeNode (System.Windows.Forms.TreeNode) 作为我的一个应用程序的用户设置。

if(treeView.SelectedNode != null)
{
    Properties.Settings.Default.SelectedTreeNode = treeView.SelectedNode;
    Properties.Settings.Default.Save();
}

然后在应用程序负载上,我尝试使用该设置

if (Properties.Settings.Default.SelectedTreeNode != null)
    treeView.SelectedNode= Properties.Settings.Default.SelectedTreeNode;

但无论我做什么,Properties.Settings.Default.SelectedTreeNode当我重新加载应用程序时总是为空。

我也试过只使用一个对象并转换为一个 TreeNode,但这也不起作用。

我真的不想为此使用字符串设置,并且如果可能的话想坚持使用 TreeNode,但是如果无法使用 TreeNode,则序列化的 TreeNode 将起作用。我只是对序列化不太熟悉。

标签: c#.netwinformstreeviewsettings

解决方案


即使您可以存储TreeNode在设置中,也不能将反序列化的节点分配SelectedNodeTreeView. TreeNode是引用类型,并且由于您从设置加载的实例与树中存在的实例不同,因此分配没有意义并且将不起作用。Taw的评论中的 b 点已经提到了这一点。

要在设置中保留选定节点,最好依赖字符串属性。你至少有两个选择:

  1. 在设置中存储Name节点的属性
  2. 在设置中存储FullPath节点的属性

选项 1 - 名称属性

每个TreeNode都有一个Name可用于查找节点的属性。

  • 创建节点时为其分配唯一键:

    treeView1.Nodes.Add("key", "text");
    
  • 保存数据时,存储treeView1.SelectedNode.Name在设置中。

  • 根据设置选择节点:

    treeView1.SelectedNode = treeView1.Nodes.Find("some key", true).FirstOrDefault();
    

选项 2 - FullPath 属性

每个TreeNode都有一个FullPath从根树节点到当前树节点的路径。

路径由必须导航以到达该树节点的所有树节点的标签组成,从根树节点开始。节点标签由包含该节点的 TreeView 控件的 PathSeparator 属性中指定的分隔符分隔。

  • 创建节点时,不需要做特殊设置。每个节点都有FullPath.

  • 保存数据时,存储treeView1.SelectedNode.FullPath在设置中。

  • 根据设置选择节点:

    treeView1.SelectedNode = treeView1.Nodes.FindByPath(@"path\to\the\node");
    

在上面的代码中,FindByPath是一个扩展方法,您可以创建它以通过路径查找 ndoe:

using System.Windows.Forms;
public static class TreeViewExtensiona
{
    public static TreeNode FindByPath(this TreeNodeCollection nodes, string path)
    {
        TreeNode found = null;
        foreach (TreeNode n in nodes)
        {
            if (n.FullPath == path)
                found = n;
            else
                found = FindByPath(n.Nodes, path);
            if (found != null)
                return found;
        }
        return null;
    }
}

推荐阅读