2008-09-11 13 views
2

J'ai une application qui lit une table à partir d'une base de données.Création d'objets pilotés par la base de données pour remplir un Treeview - très lent

Je lance une requête SQL pour obtenir un jeu de résultats, basé sur une valeur de chaîne unique que je glane des résultats, j'utilise une instruction case/switch pour générer certains objets (ils héritent TreeNode BTW). Ces objets créés sont redirigés vers un objet Dictionnaire à utiliser ultérieurement.

tout en générant ces objets j'utilise une partie des valeurs de l'ensemble de résultats pour remplir les valeurs dans l'objet par l'intermédiaire des poseurs.

Je QUERY le dictionnaire pour obtenir un type d'objet particulier et l'utiliser pour remplir un TreeView. Cependant il n'est pas possible de peupler 2 objets du même type dans un treeview à partir de l'objet Dictionary (vous obtenez une erreur d'exécution - qui m'échappe pour le moment, quelque chose à référencer le même objet). Donc ce que je dois faire est d'utiliser un memberwiseClone et implémenter IClonable pour contourner cela.

Est-ce que je fais cela correctement? Y a-t-il un meilleur moyen - parce que je pense que cela amène mon programme à être très lent à ce stade. À tout le moins, je pense que c'est un peu maladroit - des conseils de personnes qui en savent plus que moi - grandement apprécié.

Répondre

1

Pour ajouter à @Brad, remplir seulement l'arbre au besoin. Cela signifie que vous devez vous accrocher à l'événement expand des noeuds de l'arbre. Ceci est similaire à la façon dont Windows Explorer fonctionne lorsqu'il s'agit de partages réseau.

Il devrait y avoir 1 TreeNode objet par nœud d'arbre réel dans l'arbre - ne pas essayer de réutiliser les choses. Vous pouvez soit les associer à vos données en utilisant la propriété Tag (c'est la méthode recommandée), soit vous pouvez sous-classer le TreeNode lui-même (c'est la méthode Java, mais moins utilisée dans .NET).

(L'utilisation des méthodes de clonage est généralement une indication que vous êtes soit (a) faire quelque chose de mal, ou (b) besoin de prendre votre modèle de domaine de séparer les objets mutables d'être immuable.)

2

Y at-il une raison que vous utilisez le dictionnaire externe? Je remplirais l'arbre directement lorsque les données sont interrogées.

Si vous avez besoin le dictionnaire, vous pouvez définir la propriété .Tag du nœud d'arbre pour pointer vers les données dans votre dictionnaire.

0

avez-vous considéré en utilisant une vue de l'arbre virtuel qui ne charge que les nœuds que l'utilisateur veut vraiment regarder - j'ai eu un bon succès avec le composant de www.infralution.com