如何自动检查父项

时间:2015-09-10 05:59:30

标签: c# visual-studio-2012

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

        }
}

1 个答案:

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

如果您愿意,可以将该代码放入您自己的方法或扩展方法中,但我认为这是一个非常简单的代码。如果您需要更复杂的逻辑,请在此处进行描述。