所以我有一个树视图开始是空的。事件顺序如下:
-
添加新的根节点。代码使标签编辑框立即弹出,我给它起了一个名字。
-
向该根节点添加新的子节点。
-
在第一个根节点之后添加一个新的根节点。弹出标签编辑框,我给它命名。
第二个根节点采用它的新名称,但是步骤2中添加的子节点也是这样。现在,它不是
真的?
子节点的文本;如果我在调试器中检查该treenode,它具有子节点的正确文本。但是,输入到根节点中的文本通过扩展和折叠其父节点而一直存在,直到发生其他事情,我需要重建树。
我以一种奇怪的方式构建树,从父节点中删除所有根节点,从根节点中删除所有子节点,更新所有标记和文本,创建新节点,然后将节点重新添加到父节点中,但是我已经检查过了,正确的文本与正确的节点相关联。显示错误文本的TreeNode只对一个对象建模,其文本属性中没有任何其他内容,并且在重新添加到其父节点之前,将其文本设置回正确的值(“无标题操作”)。
我所能想到的罪魁祸首就是标签编辑框的代码,它基于一个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
由上下文菜单项的Click事件调用,在添加新的根节点并使其成为选定的节点后立即调用。这个
DisplayName
AfterLabeledit事件处理程序中的setter会触发另一个事件链来重建树。那么,我是不是在AfterLabeledit事件中通过改变树视图的内容来破坏它的一些内部结构?