Вопрос

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

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

Payment.Value = "1|2|1"
Это было полезно?

Решение

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

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

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

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

Другие советы

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

Например, в .Net начиная с 4.5 это будет так:

myTreeNode.Tag = myObject;

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top