C# 实际上取消选择TreeView(.NET)中的所有节点

C# 实际上取消选择TreeView(.NET)中的所有节点,c#,.net,vb.net,winforms,treeview,C#,.net,Vb.net,Winforms,Treeview,我正在尝试取消选择树视图中的所有节点。所谓“实际上”,我的意思是TreeView1.SelectedNode=null实际上将取消选择树中的节点 现在,从视觉上讲,节点被取消选择。但是,当我尝试添加新节点时,treeview将自动选择树中的第一个节点(在顶部),并在理想情况下创建父节点时创建子节点。我不能在添加之前取消选择所选节点,因为用户可能希望添加子节点。我希望父/子节点的添加行为基于树视图中选择的内容。如果未选择任何内容,则添加父节点;如果选择了某些内容,则在该选定节点中添加子节点 我在一

我正在尝试取消选择树视图中的所有节点。所谓“实际上”,我的意思是
TreeView1.SelectedNode=null实际上将取消选择树中的节点

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

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

        if (tvContent.SelectedNode == null)
            tvContent.Nodes.Add(node);
        else
        {
            tvContent.SelectedNode.Nodes.Add(node);
            tvContent.SelectedNode.Expand();
        }
我有一个“全部取消选择”按钮,应该可以使上述代码正常工作。该按钮的代码很简单:

tvContent.SelectedNode = null;
请原谅我同时标记了C#和VB.NET。我对这两种语言都很在行,所以如果有人能用这两种语言帮助我,那就太好了

谢谢

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

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

EDIT2:问题在于使用InputBox输入节点的标题。无论出于何种原因,这都会更改树视图的选定节点。我在一个股票项目中尝试了这一点,并成功地复制了这个问题。我想没有办法解决这个问题:我试图重现你的场景,但失败了。将SelectedNode设置为null后,在尝试读回它时,它仍然为null。有几件事我想核实一下:

  • 确实要取消选择节点吗?如果您将TreeView的“HideSelection”属性设置为True(默认值),则只要TreeView失去焦点,选择就会消失(例如,当您单击“全部取消选择”按钮时,使其看起来好像正在工作)。通过将HideSelection设置为False,确保情况并非如此

  • 是否确实在将SelectedNode设置为null时未触发事件处理程序(如SelectedNodeChanged)


  • 我试图重现你的情景,但失败了。将SelectedNode设置为null后,在尝试读回它时,它仍然为null。有几件事我想核实一下:

  • 确实要取消选择节点吗?如果您将TreeView的“HideSelection”属性设置为True(默认值),则只要TreeView失去焦点,选择就会消失(例如,当您单击“全部取消选择”按钮时,使其看起来好像正在工作)。通过将HideSelection设置为False,确保情况并非如此

  • 是否确实在将SelectedNode设置为null时未触发事件处理程序(如SelectedNodeChanged)


  • 因此,要得到“真”的取消选择是不可能的。一旦treeview失去焦点,然后再次获得焦点(例如,通过弹出的inputbox窗口),所选节点将不再为空


    我的工作是引入一个带有一些输入选项的面板,这样节点标题输入就可以在主窗体上而不是在另一个窗体上完成。我不喜欢这个修复,但它是所有可以做的。

    因此,得到“真”的取消选择是不可能的。一旦treeview失去焦点,然后再次获得焦点(例如,通过弹出的inputbox窗口),所选节点将不再为空

    我的工作是引入一个带有一些输入选项的面板,这样节点标题输入就可以在主窗体上而不是在另一个窗体上完成。我不喜欢这个修复,但它是所有可以做的。

    这对我来说很有效

    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
    
    这对我有用

    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
    

    将断点放在tvContent.SelectedNode块上,F11(逐步调试)之后,查看代码的哪一行将tvContent.SelectedNode更改为第一个节点。未找到任何更改它的代码,它看起来确实像是自己更改的。@Martheen请查看我的后期编辑。这似乎是内在的奇怪行为。net@Martheen查看我的帖子“EDIT2”。有什么想法吗?用InputBox输入标题是什么意思?不妨发布您的库存项目,以便我们可以复制该问题。在tvContent.SelectedNode块上放置一个断点,F11(逐步调试)之后,查看您的代码的哪一行将tvContent.SelectedNode更改为第一个节点。未找到任何更改它的代码,老实说,它看起来像是被自己改变了。@Martheen请查看我的帖子编辑。这似乎是内在的奇怪行为。net@Martheen查看我的帖子“EDIT2”。有什么想法吗?用InputBox输入标题是什么意思?不妨发布你的股票项目,这样我们就可以复制这个问题。这是作为一个答案发布的,但它并不试图回答这个问题。它可能是一个编辑,一个评论,另一个问题,或者全部删除。嘿,谢谢你的回复!1.HideSelection设置为true,但更改后会出现相同问题。2.据我所知,在所选节点设置为null后,不会触发任何事件,即使是“AfterSelect”。我做了一个深入的调试,看起来树视图在添加新节点时会拒绝没有选定的节点。我目前的解决方案是在添加新节点之前设置某种标志,以确定是否首先选择了另一个节点。我的帖子“EDIT2”提供了一种复制问题的方法。我不知道如何解决这样的问题:这是作为一个答案发布的,但它并不试图回答这个问题。可能是b