2012-04-12 3 views
3

Это трудно объяснить, поэтому я просто скажу вам, чего я хочу достичь, и как я это делаю, поэтому, возможно, у кого-то есть идея о том, что я делаю неправильно.C# TreeView Collapse/Expand on parent select

В моем winForm у меня есть элемент управления TreeView, который я заполняю. У всех родителей есть дети (любое их число), но у детей нет детей. Пример:

- Parent 1 
     Child 1 
     Child 2 
     Child 3 
- Parent 2 
     Child 4 

Поведение я хочу следующее:

  1. , когда пользователь нажимает ребенок его получить он выбран (сделано по умолчанию)
  2. Когда пользователь щелкает родитель, он должен либо свернуть или развернуть, но не изменить ни один из вариантов.

Пункт 1 не представляет проблемы, так как это поведение TreeView по умолчанию, но это еще одна история.

Вот что я сделал до сих пор:

Чтобы предотвратить родителей от выбран я добавить обработчик событий 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 = верно ; линия.

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

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

Идеи?

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

ответ

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

способ воскрешать на старые темы - лол - я с тех пор тронулась этот проект, но ваш ответ кажется твердым, так что я дам вам – 537mfb

+0

@ chiper Можете ли вы подробнее рассказать о том, что здесь происходит? Я не совсем уверен. Моя проблема в том, что мой SelectedNodeChanged не срабатывает, если я дважды нажимаю на один и тот же узел (один для разворачивания, один для краха) – Ortund

+0

Я не нашел событие SelectedNodeChanged в TreeView. Вы имели в виду AfterSelect? На самом деле этот код не меняет выделение, когда вы нажимаете на какой-либо корневой (расширяемый) узел. Обратите внимание, что структура вашего дерева должна следовать заявлению на вопрос: «У всех родителей есть дети (любое их число), но дети не имеют детей» – chiper