所以我有一个从空开始的TreeView。事件顺序如下:
第二个根节点采用其新名称,但步骤#2中添加的子节点也是如此。现在,它不是真正子节点的文本;如果我在调试器中检查那个TreeNode,它有一个子节点的正确文本。但是,输入到根节点的文本通过展开和折叠其父节点来维持,直到发生其他事情并且我需要重建树。
我正在以一种奇怪的方式构建树 - 从父节点删除所有根节点,从根节点删除所有子节点,更新所有标签和文本,创建新节点,然后将节点重新添加到它们的父母 - 但我已经检查过,并且正确的文本与正确的节点相关联。显示错误文本的TreeNode只构建了一个对象,其Text属性中没有任何其他内容,并且在重新添加到其父级之前将其文本设置回正确的值(“无标题操作”)节点
所有我能想到的罪魁祸首是标签编辑框的代码,它基于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
在添加新根节点并创建所选节点之后,上下文菜单项的Click事件将调用 EditSelectedCategoryName
。 AfterLabelEdit事件处理程序中的DisplayName
setter触发了另一个重建树的事件链。我是否通过在AfterLabelEdit事件中更改其内容来搞砸TreeView的一些内部结构?
答案 0 :(得分:1)
我添加了
e.CancelEdit = True
就在AfterLabelEdit处理程序的末尾,问题就消失了。显然我 正在使用TreeView的假定不变量
。答案 1 :(得分:0)
如果e.Node有父节点,您可以过滤操作,因为根节点不会有父节点。