2012-04-12 58 views
3

这一个很难解释,所以我只是告诉你我想实现什么以及我如何做,所以也许有人会对我做错的想法有所了解。C#TreeView Collapse/Expand on parent select

在我的winForm我有一个TreeView控件,我填充。所有的父母都有孩子(他们中的任何一个),但没有孩子有自己的孩子。例如:

- Parent 1 
     Child 1 
     Child 2 
     Child 3 
- Parent 2 
     Child 4 

我想要的行为如下:

  1. ,当用户点击一个孩子得到它的选择(默认情况下完成)
  2. 当用户点击一个家长,应该要么折叠或展开但不改变任何选择

点1是没有问题的,因为它是TreeView的默认行为,点2却是另一回事。

这是我迄今所做的:

为了防止选择我添加BeforeSelect事件处理程序的父,并把它下面的代码:

if (e.Node.Parent == null) 
    e.Cancel = true; 

这做这项工作完美。所以,现在我取消了我想要展开或折叠的父项的选择。因此,我改变上面的代码:

if (e.Node.Parent == null) 
{ 
    if (e.Node.IsExpanded) 
    { 
     e.Node.Collapse(); 
    } 
    else 
    { 
     e.Node.Expand(); 
    } 
    e.Cancel = true; 
} 

这有些工作 - 除了不像点击+符号,调用扩展()或折叠()使得父节点被选择,忽略e.Cancel =真;线。

我试着在调用Collapse()或Expand()之前获取SelectedNode,然后将其设置回去 - 它可以工作,但是当我这样做时它会再次展开父级以进行选择。

某些+标志确实是我想要发生的事情,当我点击父母 - 我似乎无法让它工作。

想法?

在此先感谢

回答

1

试试这个:

private bool allowExpandCollapse = false; 

    private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
    { 
     e.Cancel = !allowExpandCollapse; 
    } 

    private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e) 
    { 
     e.Cancel = !allowExpandCollapse; 
    } 

    private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
    { 
     if (e.Node.Parent == null) 
     { 
      e.Cancel = true; 
     } 
    } 

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
     if (e.Node.Parent == null) 
     { 
      allowExpandCollapse = true; 
      if (e.Node.IsExpanded) 
      { 
       TreeNode selectedNode = treeView1.SelectedNode; 
       e.Node.Collapse(); 
       allowExpandCollapse = false; 
       treeView1.SelectedNode = selectedNode; 
      } 
      else 
      { 
       e.Node.Expand(); 
       allowExpandCollapse = false; 
      } 
     } 
    } 
+0

方式复活呐老话题 - 洛尔 - 因为我已经移出这个项目,但你的答案似乎是固体,所以我将它送给你 – 537mfb 2013-07-29 11:10:44

+0

@你能解释一下这里发生了什么吗?我不完全确定。我的问题是,我的SelectedNodeChanged不会触发,如果我点击两次相同的节点(一个用于展开,一个用于折叠) – Ortund 2013-09-16 10:39:54

+0

我没有在TreeView中找到SelectedNodeChanged事件。你的意思是AfterSelect?实际上,当您单击某个根(可展开)节点时,此代码不会更改选择。请注意,树的结构应该遵循以下问题的陈述:“所有父母都有孩子(任何数量的孩子),但没有孩子有自己的孩子” – chiper 2013-10-24 16:02:53