在TreeView中继承

本文关键字:继承 TreeView | 更新日期: 2023-09-27 18:11:54

我做了一个TreeView,在那里我想做一个函数:当一个父(在我的情况下根)被检查所有的孩子被检查,如果一个孩子被检查的父母被检查。我知道这个问题有很多答案,但对我来说并不适用。我尝试的最后一件事是下一个代码,但它没有做任何事情:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
}
private void SelectParents(TreeNode node, Boolean isChecked)
{
    var root = node.Parent;
    if (root == null)
        return;
    if (isChecked)
    {
        root.Checked = true; // we should always check parent
        SelectParents(root, true);
    }
    else
    {
        if (root.Nodes.Cast<TreeNode>().Any(n => n.Checked))
            return; // do not uncheck parent if there other checked nodes
        SelectParents(root, false); // otherwise uncheck parent
    }
}

我需要在某处定义parent ?如何在TreeView中进行继承?

在TreeView中继承

首先,你需要一种方法来获得所有的父节点。这里可以使用一个简单的扩展方法。

public static List<TreeNode> Parents(this TreeNode node)
{
    var parents = new List<TreeNode>();
    TreeNode parent = node.Parent;
    while (parent != null);
    {
        parents.Add(parent);
        parent = parent.Parent;
    }
    return parents;
}

那么你需要一种方法来检查父元素的所有子元素,这同样可以通过扩展方法来完成。

public static void CheckChildren(this TreeNode node)
{
    if (!node.Checked)
        return;
    foreach (var node in node.Nodes)
    {
        node.Checked = true;
        node.CheckChildren();
    }
}

最后,当检查节点时,只需像下面这样调用foreach循环。它将遍历节点的父节点,检查它们和它们的子节点。

foreach (var parent in node.Parents())
{
    parent.Checked = true;
    parent.CheckChildren();
}

您也可以重写Parents方法来调用CheckChildren,以防止您必须在每次迭代时循环调用CheckChildren

public static CheckParentsAndChildren(this TreeNode node)
{
    TreeNode parent = node.Parent;
    while (parent != null);
    {
        parent.Checked = true;
        parent.CheckChildren();
        parent = parent.Parent;
    }
    return parents;
}

你所要做的就是

node.CheckParentsAndChildren();

扩展类可以是这样的:

public static class ExtensionClass
{
    public static List<TreeNode> Parents(this TreeNode node)
    {
        var parents = new List<TreeNode>();
        TreeNode parent = node.Parent;
        while (parent != null);
        {
            parents.Add(parent);
            parent = parent.Parent;
        }
        return parents;
    }
    public static void CheckChildren(this TreeNode node)
    {
        if (!node.Checked)
            return;
        foreach (var node in node.Nodes)
        {
            node.Checked = true;
            node.CheckChildren();
        }
    }
    public static CheckParentsAndChildren(this TreeNode node)
    {
        TreeNode parent = node.Parent;
        while (parent != null);
        {
            parent.Checked = true;
            parent.CheckChildren();
            parent = parent.Parent;
        }
        return parents;
    }
}