我正在尝试实际取消选择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
答案 0 :(得分:0)
我尝试重现您的方案但失败了。将SelectedNode设置为null后,在尝试将其读回时,它仍为null。我想检查一些事情:
您确定要取消选择该节点吗?如果您将TreeView的“HideSelection”属性设置为True(默认值),则只要TreeView失去焦点(例如,当您单击取消选择所有按钮 - 使其看起来正常工作时),选择就会消失。通过将HideSelection设置为False来确保不是这种情况。
在将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