Quelle est la meilleure façon de stocker des données sur un nœud TreeView?
-
23-08-2019 - |
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"
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;
Où 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.