如果在树视图中选中任何单个子节点,请选择父节点

Ami*_*mar 3 c# winforms

我有一个树视图,它有一些父节点和子节点.如果选择子节点,则应选择父节点.此功能正常工作,但如果父节点有多个子节点,并且我检查了多个子节点并取消选中了一个子节点,则父节点取消选中.

如果选择了子节点,我已经做了一些选择父节点的代码.

private bool updatingTreeView;

private void treSelector_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (updatingTreeView) return;
    updatingTreeView = true;
    SelectParents(e.Node, e.Node.Checked);
    updatingTreeView = false;
}

private void SelectParents(TreeNode node, Boolean isChecked)
{
    if (node.Parent != null)
    {
        node.Parent.Checked = isChecked;
        SelectParents(node.Parent, isChecked);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果检查了该父节点的任何单个子节点,我不希望未经检查的父节点.

Ser*_*kiy 7

private void SelectParents(TreeNode node, Boolean isChecked)
{
    var parent = node.Parent;

    if (parent == null)
        return;

    if (isChecked)
    {
        parent.Checked = true; // we should always check parent
        SelectParents(parent, true);
    }
    else
    {
        if (parent.Nodes.Cast<TreeNode>().Any(n => n.Checked))
            return; // do not uncheck parent if there other checked nodes

        SelectParents(parent, false); // otherwise uncheck parent
    }
}
Run Code Online (Sandbox Code Playgroud)

相同,重构

private void SelectParents(TreeNode node, Boolean isChecked)
{
    var parent = node.Parent;

    if (parent == null)
        return;

    if (!isChecked && HasCheckedNode(parent))
        return;

    parent.Checked = isChecked;
    SelectParents(parent, isChecked);
}

private bool HasCheckedNode(TreeNode node)
{
    return node.Nodes.Cast<TreeNode>().Any(n => n.Checked);
}
Run Code Online (Sandbox Code Playgroud)