c# - 使用 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 将起作用。我只是对序列化不太熟悉。
解决方案
即使您可以存储TreeNode
在设置中,也不能将反序列化的节点分配SelectedNode
给TreeView
. TreeNode
是引用类型,并且由于您从设置加载的实例与树中存在的实例不同,因此分配没有意义并且将不起作用。Taw的评论中的 b 点已经提到了这一点。
要在设置中保留选定节点,最好依赖字符串属性。你至少有两个选择:
- 在设置中存储
Name
节点的属性 - 在设置中存储
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;
}
}
推荐阅读
- python - JSON 上的 Python:如何处理凌乱的初始文件
- sql - SQL - 如何检查工资增加或减少的状态?
- arrays - C程序将数字数组向右移动N个位置购买无法正常工作
- google-cloud-platform - 用于构建和运行 Dataflow Flex 模板的 Terraform 脚本
- python - 扩展 fastapi 和问题
- xamarin.forms - 如何防止 xamarin 中的 android 和 Ios 设备显示大小变化?
- python - Python OpenCV.remap/undistort 剪切图像
- flutter - 如何在 Flutter Web 上安装具有完整路径的应用程序?
- python - 当有大数据(很多点)要绘制时,如何固定seaborn的散点图?
- amazon-web-services - 无法在 aws webrtc 中配置 libwebsockets - LIBCAP_LIBRARIES