将树视图中的节点设置为以编程方式检查 returns System.StackOverflowException

Setting a node in a treeview to checked programmatically returns System.StackOverflowException

我试图不允许在树视图中检查多个节点。

我找到了 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.WhosebugException

使用 TreeViewCancelEventArgs.Action 值仅在用户 activity 触发事件时清除复选框。

使用递归方法枚举节点。不要取消选中要检查的一个节点。

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