Select parent node if any single child node checked in treeview

c#, winforms

Solution

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

Same, refactored

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

Problem

I have a treeview that has some parent nodes and child nodes. If a child node is selected parent node should be selected. This functionality is working fine but if parent node has more than one child node and I checked more than one child node and unchecked a single child node parent node get unchecked. I have done some code for selecting parent node if child node selected. ``` 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); } } ``` I don't want unchecked parent node if any of single child node of that parent is checked.

Original source