3

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

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

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

想法?

提前致谢

4

1 回答 1

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;
            }
        }
    }
于 2013-06-03T14:26:27.570 回答