Установка узла в древовидной структуре для отмеченного программно возвращает System.StackOverflowException - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь не разрешить проверку нескольких узлов в древовидном представлении.

Я нашел обработчик события before_check, так что я могу просто снять все остальные узлы, прежде чем тот, который проверяет пользовательпроверил.

Я попытался консоль записать имя узла, просто чтобы убедиться, что у меня есть правильный слой узлов, все работает нормально.

private void TreeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
    foreach (TreeNode node in treeView1.nodes)
    {
        if (treeView1.Nodes != null)
        {
            node.Checked = false;
            //Console.WriteLine(node.Text);
        }
    }
}

Проблема заключается в том, что я пытаюсь установить узел на флажок. Это просто дает System.StackOverflowException всякий раз, когда я нажимаю на флажок.

1 Ответ

0 голосов
/ 01 октября 2019

Используйте значение TreeViewCancelEventArgs.Action, чтобы снять флажки только в том случае, если событие было вызвано пользовательской активностью.

Перечисление узлов с использованием рекурсивного метода. Не снимайте флажок с одного проверяемого узла.

private void UncheckNodesExcept(TreeNode root, TreeNode except)
{
    // Clear checkbox unless it is the one we don't want to clear
    if(root != except)
    {
        root.Checked = false;
    }

    // Recurse over childs
    foreach(TreeNode child in root.Nodes)
    {
        UncheckNodesExcept(child, except);
    }
}

private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
    TreeView treeView = sender as TreeView;

    // Only if action was triggered by user
    if (e.Action == TreeViewAction.ByKeyboard || e.Action == TreeViewAction.ByMouse)
    {
        foreach(TreeNode node in treeView.Nodes)
        {
            UncheckNodesExcept(node, e.Node);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...