Какой алгоритм используется в этом коде? - PullRequest
0 голосов
/ 06 февраля 2011

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

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

1 Ответ

1 голос
/ 06 февраля 2011

Не уверен, что у этого есть имя. Это вполне стандартно, поля _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;
    }
}

Блок finally гарантирует, что обработанное исключение (например, через ThreadExceptionDialog) не всегда оставит для переменной состояния значение true. Это необязательно, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...