神秘,幽灵般,不可能找到的TreeNode文本

时间:2009-07-02 19:44:14

标签: .net vb.net winforms treeview

所以我有一个从空开始的TreeView。事件顺序如下:

  1. 添加新的根节点。代码使标签编辑框立即弹出,我给它起了一个名字。
  2. 向该根节点添加新的子节点。
  3. 在第一个之后添加新的根节点。弹出标签编辑框,我给它起了一个名字。
  4. 第二个根节点采用其新名称,但步骤#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的一些内部结构?

2 个答案:

答案 0 :(得分:1)

我添加了

e.CancelEdit = True

就在AfterLabelEdit处理程序的末尾,问题就消失了。显然我 正在使用TreeView的假定不变量

答案 1 :(得分:0)

如果e.Node有父节点,您可以过滤操作,因为根节点不会有父节点。