如果在树视图中选中任何单个子节点,则选择父节点 [英] Select parent node if any single child node checked in treeview

查看:36
本文介绍了如果在树视图中选中任何单个子节点,则选择父节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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.

推荐答案

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

相同,重构

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

这篇关于如果在树视图中选中任何单个子节点,则选择父节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆