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

Dav*_*ins 4 treeview hierarchy data-structures

TreeView是向用户呈现层次结构的好方法,但想象下面的场景,其层次结构如下所示:

Building 1 
 -Tenant 1
   - Payment 1
   - Payment 2
Building 2
 -Tenant 1
   - Payment 1
 -Tenant 2
   - Payment 1
   - Payment 2
Run Code Online (Sandbox Code Playgroud)

当用户单击"付款"节点时,您需要在数据库中插入数据库.基本上插入所需的变量是Building_Id,Tenant_Id,Payment_Id.组装这些的一种方法是走到每个节点的父节点:

Building_Id = Payment.ParentNode.ParentNode.Id
Run Code Online (Sandbox Code Playgroud)

以下列格式存储付款节点上的所有id值是否更好,然后解析Building_Id,Tenant_Id,Payment_Id的值?例如:

Payment.Value = "1|2|1"
Run Code Online (Sandbox Code Playgroud)

God*_*eke 5

我发现处理附加数据的最佳方法是继承 TreeNode。我创建了一个包含我想要维护的共享数据的 BaseNode 类,并进一步继承任何特定节点类型的数据。

子类化的价值在于您可以像任何其他类一样维护强大的数据类型和复杂的数据类型……这避免了将数组改成带有管道分隔符等的字符串。

一旦你的节点就位,它允许你提出的相同的树遍历,除了现在你从(比如)BaseNode.MyData(你的所有子类型都将继承)中提取值。

但是,如果您这样做,需要注意一件事:您需要了解您希望这些节点具有多大的权威性。就我而言,当用户导航树时,我们会检查数据库缓存以确保我们不需要重新填充数据。


Der*_*k W 5

如果TreeNodes所述的TreeView控制有一个Tag保存的对象属性,可以包含与每个这些所需性质的定制对象相关联TreeNode的标签,则可以根据需要进行访问.

例如,.Net从4.5开始,它将是这样的:

myTreeNode.Tag = myObject;
Run Code Online (Sandbox Code Playgroud)

myTreeNode为实例TreeNode,并myObject为您定义包含您希望的数据有一个关联的自定义对象的实例TreeNode你的TreeView.

以下是有关TreeNode.Tag属性的MSDN上的文章:MSDN - TreeNode.Tag属性.