TreeView Выбор родительских узлов ребенка и детей выбранного родителя - PullRequest
0 голосов
/ 25 февраля 2012

Я использую Treeview, я уже нашел обе эти функции, и они отлично работают:

private void CheckChildren_ParentSelected(TreeNode node, Boolean isChecked)
    {
        foreach (TreeNode item in node.Nodes)
        {
            item.Checked = isChecked;

            if (item.Nodes.Count > 0)
            {
                this.CheckChildren_ParentSelected(item, isChecked);
            }
        }
    }

и

private void SelectParents(TreeNode node, Boolean isChecked)
    {
        //MessageBox.Show(node.Parent.ToString());
        if (node.Parent!=null)
        {
            node.Parent.Checked = isChecked;
            SelectParents(node.Parent, isChecked);
        }
    }

вот в чем проблема: когда я вызываю каждую из этих функций отдельно в событии AfterCheck, они работают нормально, но при вызове обеих из них в событии AfterCheck ничего не происходит, даже моя форма не загружается

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        CheckChildren_ParentSelected(e.Node, e.Node.Checked);
        SelectParents(e.Node, e.Node.Checked);

       // MessageBox.Show("hi");
    }

Это не работает! но когда я комментирую их, например, Функция SelectParents будет работать, но когда они у меня есть, ничего не происходит, даже моя форма не загружается

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

Не используйте MessageBox для отладки кода, используйте отладчик. Это легко увидеть, когда вы устанавливаете точку останова в обработчике событий. Или Debug.Print (), когда вы перегружены. Изменение свойства Checked приводит к повторному запуску обработчика событий AfterCheck. Просто используйте приватную переменную для предотвращения рекурсии:

private bool updatingTreeView;

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (updatingTreeView) return;
    updatingTreeView = true;
    CheckChildren_ParentSelected(e.Node, e.Node.Checked);
    SelectParents(e.Node, e.Node.Checked);
    updatingTreeView = false;
}
0 голосов
/ 25 февраля 2012

Пожалуйста, попробуйте вызвать SelectParents внутри CheckChildren_ParentSelected.

Редактировать: Извините, вызвать CheckChildren_ParentSelected внутри SelectParents.

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