【问题标题】:Actually deselect all nodes in TreeView (.NET)实际上取消选择 TreeView (.NET) 中的所有节点
【发布时间】:2016-09-30 04:47:30
【问题描述】:

我正在尝试实际上取消选择 TreeView 中的所有节点。 “实际上”是指TreeView1.SelectedNode = null; 实际上会取消选择树中的节点。

现在,从视觉上讲,该节点已取消选择。但是,当我尝试添加一个新节点时,treeview 将自动选择树中的第一个节点(在顶部)并在理想情况下创建一个子节点时我想创建一个父节点。我不能在添加之前取消选择选定的节点,因为用户可能想要添加一个子节点。我想要的行为是基于在树视图中选择的父/子节点添加。如果未选择任何内容,则添加父节点,如果选择了某些内容,则在该选定节点中添加子节点。

我在一个包含图像和文本的函数中构造了一个名为 nodeTreeNode 对象,然后我拥有以下内容:

        if (tvContent.SelectedNode == null)
            tvContent.Nodes.Add(node);
        else
        {
            tvContent.SelectedNode.Nodes.Add(node);
            tvContent.SelectedNode.Expand();
        }

我有一个“取消全选”按钮,应该可以使上述代码正常工作。该按钮的代码很简单:

tvContent.SelectedNode = null;

请原谅我同时标记 C# 和 VB.NET。我对这两种语言都很好,所以如果有人能用任何一种语言帮助我,那就太好了!

谢谢

编辑: 有趣的。似乎在测试所选节点是否为空时,.NET 会自动将所选节点设置为树中的第一个节点。以下代码显示了“触发器”消息框,但在 if 语句完成后立即选择树中的第一个节点。

    private void btnDeselectAll_Click(object sender, EventArgs e)
    {
        tvContent.SelectedNode = null;
        if (tvContent.SelectedNode == null) MessageBox.Show("trigger");
    }

EDIT2:问题在于使用 InputBox 作为节点的标题输入。无论出于何种原因,这都会更改树视图的选定节点。我在一个股票项目中尝试了这个并设法复制了这个问题。我想没有解决这个问题:S

【问题讨论】:

  • 在 tvContent.SelectedNode 块上放一个断点,然后按 F11(逐步调试)查看代码的哪一行将 tvContent.SelectedNode 更改为第一个节点。
  • 没有找到任何改变它的代码,老实说它看起来像它自己被改变了。
  • @Martheen 请查看我的帖子编辑。这似乎是 .net 中的奇怪行为
  • @Martheen 检查我的帖子的“EDIT2”。有什么想法吗?
  • 使用 InputBox 进行标题输入是什么意思?不妨只发布您的库存项目,以便我们可以复制问题。

标签: c# .net vb.net winforms treeview


【解决方案1】:

我试图重现您的场景但失败了。将 SelectedNode 设置为 null 后,我在尝试读回它时仍然为 null。我想检查几件事:

  1. 您确定要取消选择节点吗?如果您将 TreeView 的“HideSelection”属性设置为 True(默认),则只要 TreeView 失去焦点,选择就会消失(例如,当您单击取消全选按钮时 - 使其看起来像是在工作)。通过将 HideSelection 设置为 False 来确保不是这种情况。

  2. 确定将 SelectedNode 设置为 null 时没有触发事件处理程序(如 SelectedNodeChanged)?

【讨论】:

  • 这是作为答案发布的,但它不会尝试回答问题。它可能应该是编辑、评论、另一个问题或完全删除。
  • 您好,感谢您的回复! 1. HideSelection 设置为 true,但是在更改它时发生了同样的问题。 2. 选定节点设置为空后,据我所知,不会触发任何事件,甚至“AfterSelect”也不会触发。我做了一个深入的调试,看起来树视图在添加新节点时会拒绝没有选定的节点。我目前对解决方案的想法是在添加新节点之前设置某种标志,这将确定是否首先选择了另一个节点。
  • 我的帖子的“EDIT2”提供了一种复制问题的方法。我不知道如何解决这样的问题:S
【解决方案2】:

所以事实证明,获得“真正的”取消选择是不可能的。一旦树视图失去焦点然后再次获得焦点(例如通过弹出的输入框窗口),选定的节点将不再为空。

我的解决方法是引入一个面板,该面板通过一些输入选项变得可见,以便在主窗体而不是另一个窗体上完成节点标题输入。我不喜欢这个修复,但这是可以做到的。

【讨论】:

    【解决方案3】:

    这对我有用

    Private LastSelectetNode As TreeNode
    
    Protected Overrides Sub OnBeforeSelect(e As TreeViewCancelEventArgs)
        e.Cancel = LastSelectetNode Is Nothing  
        MyBase.OnBeforeSelect(e)
    End Sub
    
    Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
        Dim nd = MyBase.HitTest(e.Location).Node
        If LastSelectetNode Is nd Then
            SelectedNode = Nothing
            LastSelectetNode = Nothing
        Else
            LastSelectetNode = nd
        End If
        MyBase.OnMouseUp(e)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多