2009-07-02 9 views
1

J'ai donc un TreeView qui commence vide. La séquence d'événements est la suivante:Mystérieux, fantomatique, impossible à trouver Texte TreeNode

  1. Ajouter un nouveau nœud racine. Code fait apparaître la boîte d'édition d'étiquette immédiatement, et je lui donne un nom.
  2. Ajoutez un nouveau sous-noeud à ce noeud racine.
  3. Ajouter un nouveau nœud racine, après le premier. La boîte d'édition d'étiquette apparaît, et je lui donne un nom.

Le deuxième noeud racine prend son nouveau nom, tout comme le sous-noeud ajouté à l'étape 2. Maintenant, ce n'est pas vraiment le texte du sous-noeud; si j'examine ce TreeNode dans le débogueur, il a le texte approprié pour un sous-noeud. Mais ce texte qui a été entré dans le nœud racine reste en expansion et en réduisant son nœud parent, jusqu'à ce qu'il se passe quelque chose d'autre et que j'ai besoin de reconstruire l'arbre.

Je construis l'arbre d'une manière étrange - enlever tous les nœuds racine du parent, tous les nœuds enfants de la racine, mettre à jour toutes les balises et le texte, créer de nouveaux nœuds, puis rajouter les nœuds à leurs parents - mais j'ai vérifié, et le bon texte est associé au bon nœud. Le TreeNode qui montre le mauvais texte a seulement modélisé l'objet, n'a jamais rien d'autre dans sa propriété Text, et a retrouvé son texte à la bonne valeur ("untitled action") juste avant d'être rajouté à son parent nœud.

Tout ce que je peux penser à un coupable est le code de la boîte d'édition d'étiquettes, qui est basé sur un échantillon MSDN:

Private Sub EditSelectedCategoryName() 
    If Not ActionList.SelectedNode.IsEditing Then 
     ActionList.LabelEdit = True 
     ActionList.SelectedNode.BeginEdit() 
    End If 
End Sub 

Private Sub ActionList_AfterLabelEdit(ByVal sender As Object, ByVal e As NodeLabelEditEventArgs) Handles ActionList.AfterLabelEdit 
    If e.Label IsNot Nothing Then 
     e.Node.EndEdit(False) 
     CType(e.Node.Tag, ImportActionCategory).DisplayName = e.Label 
    Else 
     e.Node.EndEdit(True) 
    End If 
    ActionList.LabelEdit = False 
End Sub 

EditSelectedCategoryName est appelé par un événement de l'élément de menu contextuel Cliquez, juste après la le nouveau noeud racine est ajouté et fait le noeud sélectionné. Le setter DisplayName dans le gestionnaire d'événements AfterLabelEdit est ce qui déclenche une autre chaîne d'événements qui reconstruit l'arborescence. Est-ce que je suis en train de bousiller une structure interne de TreeView en modifiant son contenu dans l'événement AfterLabelEdit?

Répondre

1

I ajouté

e.CancelEdit = True 

droit à la fin du gestionnaire AfterLabelEdit, et le problème a disparu. Apparemment, je était futzing avec un certain invariant supposé de la TreeView ...

0

Vous pouvez filtrer l'action si e.Node a un parent, car les nœuds racine ne possèdent pas de nœuds parents.

+0

Mais l'événement est en effet appelé seulement sur les nœuds de la racine - le 'CType' échouerait autrement, et le nœud racine approprié est changé ... –

Questions connexes