在Form
我有一个带有复选框树的TreeView
。对于树中的所有子节点,我想创建一个事件来检查是否检查了根节点,并取消选中正确的情况。为此,我一定需要一个扩展类吗?
有人可以给我一步一步的解决方案吗?我已经尝试了很多解决方案;但他们什么都不做。我试图修改我的代码,但它不起作用。我的代码是扩展类。
有没有简单的解决方案?
|_| Parent
|_| Child1
|_| Child2
|_|Parent2
|_|Child3
这是我的treeView
,在名称是复选框之前。检查Parent
时会自动检查Child1 and Child2
。检查Parent2
时,会自动检查Child3
。
namespace Extension
{
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 (TreeNode child in node.Nodes)
{
child.Checked = true;
child.CheckChildren();
}
}
public static void CheckParentsAndChildren(this TreeNode node)
{
node.CheckChildren(); // Check children of current node only.
TreeNode parent = node.Parent;
while (parent != null) ;
{
parent.Checked = true;
parent = parent.Parent;
}
}
}
}
namespace WindowsFormsApplication2
{
static class Program
{
}
在Form2中我有这个:
using Extension;
namespace WindowsFormsApplication2
{
public partial class Form2 : Form
{
private bool _checking;
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
// e.Node.CheckParentsAndChildren();
if (!_checking && e.Node.Checked)
{
_checking = true;
try
{
e.Node.CheckParentsAndChildren();
}
finally
{
_checking = false;
}
}
}
}
答案 0 :(得分:1)
如果我理解正确,这应该已经解决了你的问题:
private void OnTreeViewAfterCheck(object sender, TreeViewEventArgs e)
{
var treeView = (TreeView)sender;
treeView.AfterCheck -= OnTreeViewAfterCheck;
SetChildCheckedState(e.Node);
treeView.AfterCheck += OnTreeViewAfterCheck;
}
private void SetChildCheckedState(TreeNode treeNode)
{
foreach (TreeNode childNode in treeNode.Nodes)
{
childNode.Checked = treeNode.Checked;
// Call recursively if you like
SetChildCheckedState(childNode);
}
}
如果您愿意,可以将该代码放入您自己的方法或扩展方法中,但我认为这是一个非常简单的代码。如果您需要更复杂的逻辑,请在此处进行描述。