我有一个树视图,它有一些父节点和子节点.如果选择子节点,则应选择父节点.此功能正常工作,但如果父节点有多个子节点,并且我检查了多个子节点并取消选中了一个子节点,则父节点取消选中.
如果选择了子节点,我已经做了一些选择父节点的代码.
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)
如果检查了该父节点的任何单个子节点,我不希望未经检查的父节点.
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)