Каков наилучший способ хранения данных на узле TreeView? - PullRequest
4 голосов
/ 14 февраля 2009

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

Лучше ли хранить все значения идентификаторов на узле оплаты в следующем формате, а затем анализировать значения для Building_Id, Tenant_Id, Payment_Id? Например:

Payment.Value = "1|2|1"

Ответы [ 3 ]

5 голосов
/ 06 июня 2013

Если TreeNodes элемента управления TreeView имеет свойство Tag, которое содержит объект, вы можете связать пользовательский объект, содержащий эти требуемые свойства, с каждым тегом TreeNode, тогда вы можете получить к ним доступ как необходимо.

Например, в .Net с 4.5 это будет выглядеть так:

myTreeNode.Tag = myObject;

Где myTreeNode - это экземпляр TreeNode, а myObject - это экземпляр определенного вами пользовательского объекта, который содержит данные, которые вы хотите связать с TreeNode вашего TreeView.

Вот статья о MSDN о свойстве TreeNode.Tag: MSDN - свойство TreeNode.Tag .

4 голосов
/ 14 февраля 2009

Я считаю, что лучший способ обработки дополнительных данных - это создать подкласс TreeNode. Я создаю класс BaseNode, который содержит общие данные, которые я хочу сохранить, и наследую от них для любых конкретных типов узлов.

Значение подкласса заключается в том, что вы можете поддерживать строгие типы данных и сложные типы данных, как и любой другой класс ... что позволяет избежать взлома массивов в строку с разделителями каналов и т. П.

Как только у вас есть узлы на месте, он разрешает ту же прогулку по дереву, которую вы предлагаете, за исключением того, что теперь вы извлекаете значения из (скажем) BaseNode.MyData (который будут наследовать все ваши подтипы).

Одна вещь, на которую стоит обратить внимание, если вы сделаете это, хотя: вам нужно понять, насколько авторитетными вы хотите, чтобы эти узлы были. В моем случае, когда пользователь перемещается по дереву, мы проверяем кеш базы данных, чтобы убедиться, что нам не нужно повторно заполнять данные.

1 голос
/ 23 февраля 2009

Вы могли бы подумать о том, чтобы развить идею Годеке и вместо того, чтобы создавать подклассы TreeNode, связать узлы с коллекцией бизнес-объектов - хранить ваши локальные данные в свойствах дочерних элементов коллекции. Логика сбора данных сможет предоставить вам необходимые данные, и вы получите преимущества отделения данных и логики от уровня представления.

...