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



我正在尝试实际上取消选择TreeView中的所有节点。所谓"实际",我的意思是TreeView1.SelectedNode = null;实际上会取消选择树中的节点。

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

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

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

我有一个"全部取消选择"按钮,它应该使上面的代码工作。该按钮的代码很简单:

tvContent.SelectedNode = null;

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

感谢

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

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

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

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

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

这对我有效

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

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

  1. 你确定你真的在取消选择节点吗?如果将TreeView的"HideSelection"属性设置为True(默认值),则只要TreeView失去焦点,选择就会消失(例如单击取消选择所有按钮,使其看起来像是在工作)。通过将HideSelection设置为False来确保情况并非如此。

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

最新更新