TreeView是一种向用户呈现层次结构的好方法,但想象下面的场景,其层次结构如下所示:
Building 1
-Tenant 1
- Payment 1
- Payment 2
Building 2
-Tenant 1
- Payment 1
-Tenant 2
- Payment 1
- Payment 2
当用户单击“付款”节点时,您需要插入数据库。基本上插入所需的变量是Building_Id,Tenant_Id,Payment_Id。组装这些的一种方法是走到每个节点的父节点:
Building_Id = Payment.ParentNode.ParentNode.Id
以下列格式存储付款节点上的所有ID值是否更好,然后解析Building_Id,Tenant_Id,Payment_Id的值?例如:
Payment.Value = "1|2|1"
答案 0 :(得分:5)
如果TreeNodes
控件的TreeView
具有包含对象的Tag
属性,则可以将包含所需属性的自定义对象与每个TreeNode
相关联标记,然后您可以根据需要访问它们。
例如,从4.5 .Net
开始,就像这样:
myTreeNode.Tag = myObject;
其中myTreeNode
是TreeNode
的实例,而myObject
是您定义的自定义对象的实例,其中包含您希望与TreeNode
的{{1}}关联的数据你的TreeView
。
以下是关于TreeNode.Tag属性的MSDN上的文章:MSDN - TreeNode.Tag Property。
答案 1 :(得分:4)
我发现处理其他数据的最佳方法是继承TreeNode。我创建了一个BaseNode类,它包含我想要维护的共享数据,并继承了任何特定节点类型的数据。
子类化的价值在于你可以像任何其他类一样维护强大的数据类型和复杂的数据类型......这样可以避免使用管道分隔符等将数组破解为字符串。
一旦你的节点到位,它允许你提出的相同的树步行,除了你现在从(比如)BaseNode.MyData(你的所有子类将继承)中提取值。
如果你这样做,有一点需要注意:你需要了解你想要这些节点的权威性。在我的情况下,当用户导航树时,我们检查数据库缓存以确保我们不需要重新填充数据。
答案 2 :(得分:1)
您可能会考虑进一步采用Godeke的想法,而不是将TreeNode子类化,将节点绑定到业务对象集合 - 将本地数据存储在集合子集的属性中。集合逻辑将能够为您提供所需的数据,并且您可以从表示层中分离数据和逻辑。