С # TreeView Свернуть / развернуть при родительском выборе

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

В моей 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 (), а затем вернуть его обратно - он работает, но когда я это сделаю, он снова расширит родительский элемент, чтобы сделать выбор.

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

Идеи?

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


person 537mfb    schedule 12.04.2012    source источник


Ответы (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;
            }
        }
    }
person chiper    schedule 03.06.2013
comment
Способ воскресить старую ветку - lol - с тех пор я ушел из этого проекта, но ваш ответ кажется убедительным, поэтому я дам его вам - person 537mfb; 29.07.2013
comment
@chiper Не могли бы вы объяснить, что здесь происходит? Я не совсем уверен. Моя проблема в том, что мой SelectedNodeChanged не срабатывает, если я дважды щелкаю один и тот же узел (один для развертывания, один для свертывания) - person Ortund; 16.09.2013
comment
Я не нашел события SelectedNodeChanged в TreeView. Вы имели в виду AfterSelect? Фактически, этот код не изменяет выделение, когда вы щелкаете какой-либо корневой (расширяемый) узел. Обратите внимание, что структура вашего дерева должна соответствовать утверждению из вопроса: у всех родителей есть дети (любое их количество), но ни у одного из детей нет собственных детей. - person chiper; 24.10.2013