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.