J'ai donc un TreeView qui commence vide. La séquence d'événements est la suivante:Mystérieux, fantomatique, impossible à trouver Texte TreeNode
- 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.
- Ajoutez un nouveau sous-noeud à ce noeud racine.
- 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?
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é ... –