在TreeView节点上存储数据的最佳方法是什么?

4
TreeView是向用户展示层级结构的一种好方式,但想象以下具有下面所示层次结构的情境:
Building 1 
 -Tenant 1
   - Payment 1
   - Payment 2
Building 2
 -Tenant 1
   - Payment 1
 -Tenant 2
   - Payment 1
   - Payment 2

当用户单击“Payment”节点时,您需要向数据库执行插入操作。所需的变量包括Building_Id、Tenant_Id和Payment_Id。组装这些变量的一种方法是遍历每个节点的父级:

Building_Id = Payment.ParentNode.ParentNode.Id

将Payment Node的所有id值以以下格式存储,然后解析Building_Id、Tenant_Id和Payment_Id的值是否更好?例如:

Payment.Value = "1|2|1"
3个回答

5

如果TreeView控件的TreeNodes属性具有保存对象的Tag属性,您可以将包含所需属性的自定义对象与每个TreeNode的标签相关联,然后根据需要访问它们。

例如,在4.5版的.Net中,代码如下:

myTreeNode.Tag = myObject;

其中myTreeNodeTreeNode的一个实例,而myObject是您定义的自定义对象的一个实例,该对象包含您希望与TreeViewTreeNode相关联的数据。

这里有一篇关于TreeNode.Tag属性的MSDN文章:MSDN - TreeNode.Tag Property


我尝试过这个,但它没有起作用。我创建了一个结构体并将其放入我的treenode.tag中。它没有出现错误地添加,但我无法访问数据。如果我在控制台中输出标签,它只会输出tagInfo,这是我的结构体名称。你有成功实现过吗? - Thomas Williams
@ThomasWilliams:Tag 属性将对象存储为通用的 object 类型,而不是实际派生类型。例如,如果您要在 Tag 属性中存储一个 string 对象,则它将以 object 类型存储。当检索存储的 string 对象时,需要将存储在 Tag 属性中的通用 object 强制转换为您想要访问的真正基础类型,例如在此示例中为 string。您可以将 string 替换为任何 object 派生类型,该示例仍然成立。 - Derek W

5
我发现处理额外数据的最佳方法是对TreeNode进行子类化。我创建了一个名为BaseNode的类,其中包含我想要维护的共享数据,并从其继承任何特定的节点类型。
子类化的价值在于,您可以像任何其他类一样维护强类型和复杂数据类型... 这避免了将数组用管道分隔符等方式转换为字符串。
一旦您的节点就位,它就允许您提取(例如)BaseNode.MyData中的值(所有子类都将继承该值),并实现您所建议的树遍历。
不过,如果您这样做,请注意一个问题:您需要了解这些节点的权威性。在我的情况下,当用户导航树时,我们会检查数据库缓存以确保我们不需要重新填充数据。

1
你可以考虑进一步采用Godeke的想法,而不是子类化TreeNode,将节点与业务对象集合绑定 - 将本地数据存储在集合子项的属性中。集合逻辑将能够为您提供所需的数据,并获得将数据和逻辑与表示层分离的好处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接