2011-02-06 5 views
0

Этот код проверяет и удаляет дочерние узлы элемента управления treeview. Какой алгоритм используется в этом коде?Какой алгоритм используется в этом коде?

private int _callCountUp; 

private int _callCountDn; 

private void tvwPermissions_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e) 
     { 
      bool anyChecked = false; 

      if (_callCountDn == 0 && e.Node.Parent != null) 
      { 
       anyChecked = false; 
       foreach (TreeNode childNode in e.Node.Parent.Nodes) 
       { 
        if (childNode.Checked) 
        { 
         anyChecked = true; 
         break; 
        } 
       } 
       _callCountUp += 1; 

       if (anyChecked) 
        e.Node.Parent.Checked = true; 

       _callCountUp -= 1; 
      } 

      if (_callCountUp == 0) 
      { 
       foreach (TreeNode childNode in e.Node.Nodes) 
       { 
        _callCountDn += 1; 
        childNode.Checked = e.Node.Checked; 
        _callCountDn -= 1; 
       } 
      } 
     } 
+2

Я не совсем понимаю этот вопрос. Разве алгоритм не используется совершенно очевидно? :) Или вам интересно, как это работает? – Skurmedel

+0

Другой вопрос: когда вызывается 'tvwPermissions_AfterCheck', я подозреваю, когда вы вызывали' Checked = ... 'на узле? – Skurmedel

ответ

1

Не уверен, что у этого есть имя. Это стандартно, поля _callCountUp/Dn избегают проблем при изменении свойства Checked узла, заставляет обработчик события AfterCheck запускаться снова. StackOverflow - очень типичный результат, когда обработчик событий рекурсирует без ограничений.

Родовая картина напоминает это:

private bool modifyingNodes; 

private void treeview_AfterCheck(object sender, TreeViewEventArgs e) { 
    if (modifyingNodes) return; 
    modifyingNodes = true; 
    try { 
     // etc.. 
    } 
    finally { 
     modifyingNodes = false; 
    } 
} 

Окончательно блок гарантирует, что исключение обрабатывается (например, через ThreadExceptionDialog) не навсегда покинуть государственное переменное значение ИСТИНЫ. Конечно, это необязательно.

Смежные вопросы