2016-06-01 243 views
0

我试图实际上取消选择我的TreeView中的所有节点。通过“实际”,我的意思是TreeView1.SelectedNode = null;实际上会取消选择树中的节点。实际上取消选择TreeView中的所有节点(.NET)

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

我构造一个名为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会自动将所选节点设置为树中的第一个节点。以下代码显示“触发器”消息框,但在if语句完成后立即选择树中的第一个节点。

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

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

+0

放在tvContent.SelectedNode块,F11(分步调试)断点权之后,看看你的代码的行改变了tvContent.SelectedNode到第一节点。 – Martheen

+0

没有找到任何改变它的代码,它真的看起来像它自己改变。 – KingDan

+0

@Martheen请查看我的帖子编辑。看起来这是奇怪的行为.net – KingDan

回答

0

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

我周围的工作是要引入使节点标题输入在主窗体上,而不是在另一种形式做了一些输入选项变为可见的面板。我不喜欢这个修补程序,但这是所有可以完成的。

0

我试图重现您的方案,但失败了。在将SelectedNode设置为null之后,在尝试读取它时它仍为空。我想检查几件事:

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

  2. 你确定你不是触发事件处理程序(如SelectedNodeChanged)当您设置SelectedNode为空?

+1

这是作为答案发布的,但它不会试图回答这个问题。它应该可能是编辑,评论,另一个问题,或者完全删除。 – Codexer

+0

嘿,谢谢你的回应! 1. HideSelection设置为true,但在更改时发生同样的问题。 2.在我选择的节点被设置为null后,没有事件被触发,甚至没有“AfterSelect”。 我做了一个深入的调试,它看起来像树视图将拒绝添加一个新节点时没有选定的节点。我目前的解决方案的想法是在添加新节点之前设置某种标志,这将确定是否首先选择了另一个节点。 – KingDan

+0

我的文章“EDIT2”提供了一种复制问题的方法。我不知道如何解决这样的问题:S – KingDan

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