2009-02-13 6 views
4

Le TreeView est une belle façon de présenter une hiérarchie aux utilisateurs, mais imaginez le scénario suivant avec la hiérarchie décrite ci-dessous:Quelle est la meilleure façon de stocker des données sur un nœud TreeView?

Building 1 
-Tenant 1 
    - Payment 1 
    - Payment 2 
Building 2 
-Tenant 1 
    - Payment 1 
-Tenant 2 
    - Payment 1 
    - Payment 2 

où vous devez faire une insertion dans une base de données lorsque l'utilisateur clique sur le paiement nœud. Essentiellement, les variables requises pour l'insertion sont Building_Id, Tenant_Id, Payment_Id. Une façon de les assembler est de marcher au parent de chaque nœud:

Building_Id = Payment.ParentNode.ParentNode.Id 

Est-il préférable de stocker toutes les valeurs des id sur le nœud de paiement dans le format suivant, puis analyser les valeurs pour BUILDING_ID, Tenant_Id, Payment_Id? Par exemple:

Payment.Value = "1|2|1" 

Répondre

4

Je trouve que la meilleure façon de gérer des données supplémentaires est de sous-classer TreeNode. Je crée une classe BaseNode qui contient les données partagées que je veux gérer, et j'en hérite plus loin pour tous les types de nœuds spécifiques. La valeur du sous-classement est que vous pouvez maintenir des types de données forts et des types de données complexes comme n'importe quelle autre classe ... ce qui évite de pirater des tableaux dans une chaîne avec des séparateurs de tuyaux et autres. Une fois que vous avez vos nœuds en place, vous autorisez la même marche que celle que vous proposez, sauf que vous tirez maintenant les valeurs de (par exemple) BaseNode.MyData (dont hériteront tous vos sous-types). Une chose à surveiller si vous faites cela: vous devez comprendre à quel point ces nœuds font autorité. Dans mon cas, lorsque l'utilisateur navigue dans l'arborescence, nous vérifions avec un cache de base de données pour nous assurer que nous n'avons pas besoin de repeupler les données.

+0

Grande réponse - juste ce que je cherchais. Merci! –

1

Vous pouvez envisager de prendre l'idée de Godeke plus loin et au lieu de sous-classer TreeNode, liez les nœuds à une collection d'objets métier - en stockant vos données locales dans les propriétés des enfants de la collection. La logique de collecte sera en mesure de vous fournir les données dont vous avez besoin et vous aurez l'avantage de séparer les données et la logique de la couche de présentation.

5

Si le TreeNodes du contrôle TreeView ont une propriété Tag qui détient un objet, vous pouvez associer un objet personnalisé contenant les propriétés souhaitées avec chaque balise de TreeNode, vous pouvez y accéder au besoin.

Par exemple, dans .Net que de 4,5, ce serait comme ceci:

myTreeNode.Tag = myObject; 

myTreeNode est une instance de TreeNode et myObject est une instance de l'objet personnalisé que vous avez défini qui contient les données que vous souhaitez avoir associé à un TreeNode de votre TreeView.

Voici un article sur MSDN sur la propriété TreeNode.Tag: MSDN - TreeNode.Tag Property.

Questions connexes