Question

Quelle serait la cause d'un effondrement TreeView, autre qu'un appel à la méthode .Collapse () sur un TreeNode ou la méthode .CollapseAll () du TreeView?

Dans une application que je développe, le TreeView sera tout simplement pas se comporter correctement. Le TreeView maintient que deux niveaux. Lors de la sélection d'un enfant d'un nœud parent, tous les autres nœuds effondrement immédiatement. Cependant, il n'y a pas de méthode .Collapse () ou .CollapseAll () dans mon code que ce soit!

Toutes les propriétés du TreeView sont laissés à leurs valeurs par défaut, sauf la propriété .LabelEdit, qui est définie sur true. Le TreeView a un code associé dans l'événement AfterLabelEdit pour un simple validation / routine MessageBox.

J'ai essayé:

  • Accrocher l'événement BeforeCollapse de le TreeView et l'élévation du drapeau e.CancelAction.

  • extension manuellement tous les nœuds au sein AfterSelect du TreeView un événement. (Cela fonctionne bien comme expérience, mais je ne veux pas désavouer effondrement noeud
    tout à fait!)

A de nombreux points dans le code, je suis à travers le TreeView itérer, nœud par nœud, pour vérifier les propriétés. Toutefois, aucun ajout ou suppression de noeuds se produisent. Les seules propriétés TreeNode qui sont modifiés lorsque l'utilisateur effectue des sélections sont .ImageIndex et .SelectedImageIndex.

autre que les deux solutions ci-dessus, je n'ai pas la moindre idée de ce qui peut causer cette erreur. Même si aucune solution peut être réalisée, pourrait-on avoir une idée sur la façon de s'y prendre pour piéger l'effondrement? (Je l'ai essayé de placer un point d'arrêt dans l'événement BeforeCollapse, mais il ne se déclenche pas à moins que l'utilisateur s'effondre explicitement le nœud via la souris ou le clavier.)


Mise à jour:

Le problème est dû à la propriété chaging .SelectedImageIndex sur tout TreeNode. La modification de cette propriété entraîne tous les autres nœuds de l'effondrement.

J'ai essayé entourant le code de modification de la propriété .SelectedImageIndex avec .BeginUpdate () et .EndUpdate () appelle en vain.

Comment cela peut-il être évité?

Était-ce utile?

La solution

Ceci est un effet secondaire de la façon dont les fenêtres natives fonctionnent sous Windows. La plupart des options de la fenêtre sont spécifiées par des drapeaux de style dans l'appel CreateWindowEx (). trucs de base, comme ce que la frontière ressemble à une forme. Quel genre de vision un ListView devrait avoir. Que ce soit un TreeView doit afficher des cases à cocher.

Ces styles sont exposés comme des propriétés sur un contrôle. Mais il y a un problème. Modification d'une telle propriété, il faut la fenêtre pour être recréée à partir de zéro afin que les nouveaux indicateurs de style peuvent être spécifiées dans l'appel CreateWindowEx (). Cela a des effets secondaires, la fenêtre se complètement recréée il perd tout état précédent.

Windows Forms fait un très bon travail de faire ce regard lisse, la restauration de l'état précédent après recréer la fenêtre. Mais il y a des fuites ici et là. Et quelques bugs pure et simple. Une fuite dans TreeView est l'état exact dont les noeuds sont effondrés et qui ne sont pas. Garder la trace de c'est tout simplement pas pratique.

Diagnostiquer cela en mettant la propriété poignée du TreeView dans une fenêtre de la montre. Si vous le voyez changer, vous avez trouvé la propriété. La liste des indicateurs de style est disponible ici, vous pouvez probablement la carte leur nom à leur propriété correspondante.

Peut-être il est clair qu'il n'y a pas une grande solution pour ce problème, autre que d'éviter de changer cette propriété. Des problèmes comme celui-ci est ce que WPF begat.

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