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

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

在我的 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;
}

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

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

不知何故,当我单击父级时,+ 号正是我想要发生的事情 - 我似乎无法让它工作。

想法?

提前致谢

【问题讨论】:

    标签: c# treeview expand collapse


    【解决方案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 吗?实际上,当您单击某个根(可扩展)节点时,此代码不会更改选择。请注意,树的结构应遵循问题中的陈述:“所有父母都有孩子(任意数量),但没有孩子有自己的孩子”
    猜你喜欢
    • 2013-12-18
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多