C# TreeView 在父级选择上折叠/展开

标签 c# treeview

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

在我的 winForm 中,我有一个我填充的 ​​TreeView 控件。所有 parent 都有 child (任何数量),但没有 child 有自己的 child 。示例:

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

我想要的行为如下:

  1. 当用户点击一个 child 时,它会被选中(默认完成)
  2. 当用户点击父项时,它应该折叠或展开但不改变任何选择

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

这是我到目前为止所做的:

为了防止选择父级,我添加了一个 BeforeSelect 事件处理程序并在其中放入以下代码:

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

这完美地完成了工作。所以现在我取消了我想展开或折叠它的 parent 的选择。所以我把上面的代码改成了:

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,然后将其设置回去 - 它有效,但当我这样做时,它会再次展开父节点以进行选择。

不知何故,当我点击一个父级时,+ 号完全符合我想要发生的事情 - 我似乎无法让它工作。

想法?

提前致谢

最佳答案

试试这个:

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

关于C# TreeView 在父级选择上折叠/展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10126873/

相关文章:

javascript - 如何禁用 Bootstrap Treeview 的父节点复选框

wpf - 用动态数据集替换 WPF 用户控件中的静态 XmlDataProvider 的正确方法是什么?

c# - 展开 TreeViewItem 时调用命令

c# - EmguCV (OpenCV) ORBDetector 只发现坏匹配

c# - 是否可以阻止 ObjectDataSource 自动绑定(bind)?

c# - 如何通过 C#/WinForms 使用 GDI+ 在多边形上绘制渐变边框?

C# 获取类型() : Code how to get the type of T in List<T> without actual elements?

delphi - 带有复选框的 TreeView - 添加复选框行为

c# - LINQ Distinct 与自定义 IEqualityComparer

javascript - 在纯 Javascript 中从 Url 生成 Treeview