在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中进行继承?
首先,你需要一种方法来获得所有的父节点。这里可以使用一个简单的扩展方法。
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;
}
}