C# TreeView 折叠/展开父选择

Posted

技术标签:

【中文标题】C# TreeView 折叠/展开父选择【英文标题】:C# TreeView Collapse/Expand on parent select 【发布时间】:2012-04-24 23:51:00 【问题描述】:

这个很难解释,所以我只会告诉你我想要实现什么以及我是如何做到的,所以也许有人会知道我做错了什么。

在我的 winForm 中,我有一个填充的 TreeView 控件。所有父母都有孩子(任意数量),但没有孩子有自己的孩子。示例:

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

我想要的行为如下:

    当用户点击一个孩子时,它会被选中(默认完成) 当用户单击父级时,它应该折叠或展开,但不更改任何选择

第 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;

这有点工作 - 除了,与单击 + 号不同,调用 Expand() 或 Collapse() 会选择父节点,而忽略 e.Cancel = true;行。

我尝试在调用 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;
            
        
    

【讨论】:

复活旧线程的方法 - 哈哈 - 我已经离开了这个项目,但你的答案似乎很可靠,所以我会把它给你 @chiper 你能解释一下这里发生了什么吗?我不完全确定。我的问题是,如果我两次单击同一节点(一次用于展开,一次用于折叠),我的 SelectedNodeChanged 不会触发 我没有在 TreeView 中找到 SelectedNodeChanged 事件。您是说 AfterSelect 吗?实际上,当您单击某个根(可扩展)节点时,此代码不会更改选择。请注意,树的结构应遵循问题中的陈述:“所有父母都有孩子(任意数量),但没有孩子有自己的孩子”

以上是关于C# TreeView 折叠/展开父选择的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataBound 树视图展开/折叠

C#中,如何实现点击treeview父节点的文字达到展开改节点的效果?

Delphi TreeView 问题

C#中如何设置treeview每个节点背景图片及背景颜色

JavaFX TreeView:删除展开/折叠按钮(披露节点)和功能

关于c#中treeview节点的收缩与展开(.net web)