C# TreeView свернуть / развернуть на родительском select


Это трудно объяснить, поэтому я просто расскажу вам, чего я хочу достичь и как я это делаю, так что, возможно, у кого-то будет идея о том, что я делаю неправильно.

В моей 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;.

Я попытался получить SelectedNode перед вызовом Collapse () или Expand (), а затем установить его обратно - это работает, но когда я это сделаю, он снова развернет родительский объект, чтобы сделать выбор.

Где-то знак + делает именно то, что я хочу, чтобы произошло, когда я нажимаю на родителя-я просто не могу заставить его работать.

Идеи?

Заранее спасибо

1 3

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