代码之家  ›  专栏  ›  技术社区  ›  John Calsbeek

神秘,幽灵般,不可能找到树型文字

  •  1
  • John Calsbeek  · 技术社区  · 15 年前

    所以我有一个树视图开始是空的。事件顺序如下:

    1. 添加新的根节点。代码使标签编辑框立即弹出,我给它起了一个名字。
    2. 向该根节点添加新的子节点。
    3. 在第一个根节点之后添加一个新的根节点。弹出标签编辑框,我给它命名。

    第二个根节点采用它的新名称,但是步骤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事件中通过改变树视图的内容来破坏它的一些内部结构?

    2 回复  |  直到 15 年前
        1
  •  1
  •   John Calsbeek    15 年前

    我补充说

    e.CancelEdit = True
    

    就在AfterLabeledit处理程序结束时,问题就消失了。显然我 用树视图的一些假定不变量继续…

        2
  •  0
  •   Shea    15 年前

    如果e.node有父节点,则可以筛选该操作,因为根节点没有父节点。