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

时间:2016-06-01 01:37:16

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

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

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

我在一个带有图像和文本的函数中构造了一个名为TreeNode的{​​{1}}对象,然后我就拥有了以下内容:

node

我有一个“取消全选”按钮,可以使上面的代码工作。该按钮的代码只是:

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

请原谅我对C#和VB.NET的标记。如果有人可以用任何一种非常棒的语言来帮助我,我对两者都很好。

由于

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

if

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

3 个答案:

答案 0 :(得分:0)

我尝试重现您的方案但失败了。将SelectedNode设置为null后,在尝试将其读回时,它仍为null。我想检查一些事情:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这对我有用

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
相关问题