C# C树视图在父选择时折叠/展开

C# C树视图在父选择时折叠/展开,c#,treeview,expand,collapse,C#,Treeview,Expand,Collapse,这一点很难解释,所以我会告诉你我想要实现什么以及我是如何做到的,这样也许有人会知道我做错了什么 在我的winForm中,我有一个我填充的TreeView控件。所有的父母都有孩子,数量不限,但没有一个孩子有自己的孩子。例如: - Parent 1 Child 1 Child 2 Child 3 - Parent 2 Child 4 我想要的行为如下: 当用户单击一个子项时,默认情况下会选择“完成” 当用户单击父项时,它应该折叠或展开,

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

在我的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,然后将其设置回原来的位置-它可以工作,但当我这样做时,它将再次展开父节点以进行选择

当我点击某个家长时,+符号正是我希望发生的事情——我似乎无法让它工作

想法

提前感谢

试试这个:

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

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