Question

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:

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 nœud de paiement. Essentiellement, les variables requises pour l'insert sont BUILDING_ID, Tenant_Id, Payment_Id. Une façon de les assembler est de marcher au parent de chaque noeud:

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 de BUILDING_ID, Tenant_Id, Payment_Id? Par exemple:

Payment.Value = "1|2|1"
Était-ce utile?

La solution

Je trouve la meilleure façon de traiter les données supplémentaires est de sous-classe TreeNode. Je crée une classe BaseNode qui contient les données partagées je veux maintenir, et d'hériter de plus que pour tous les types de noeuds spécifiques.

La valeur de sous-classement est que vous pouvez maintenir les types de données solides et types de données complexes comme toute autre classe ... ce qui évite des réseaux infiltrant dans une chaîne avec des séparateurs de tuyaux et autres.

Une fois que vous avez vos nœuds en place, il permet même arbre de marche que vous proposez, sauf que maintenant vous tirez les valeurs de (par exemple) BaseNode.MyData (que tous les sous-types de vos hériteront).

Une chose à surveiller si vous faites cela si vous avez besoin de comprendre comment vous voulez que ces nœuds faisant autorité soient. Dans mon cas, lorsque l'utilisateur navigue l'arbre, nous vérifions avec un cache de base de données pour nous assurer de ne pas besoin de repeupler les données.

Autres conseils

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 l'étiquette de chaque 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 associer à une TreeNode de votre TreeView.

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

Vous pourriez envisager de prendre l'idée de Godeke plus loin et au lieu de la sous-classement TreeNode, lier les noeuds à une collection d'objets d'affaires - le stockage de vos données locales dans les propriétés des enfants de collecte. La logique de collection sera en mesure de vous donner les données dont vous avez besoin et vous tirer parti des avantages de séparer les données et la logique de la couche de présentation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top