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。有几件事我想核实一下:
我试图重现你的情景,但失败了。将SelectedNode设置为null后,在尝试读回它时,它仍然为null。有几件事我想核实一下:
因此,要得到“真”的取消选择是不可能的。一旦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