树节点,前面有一个复选框
我想选中父节点的时候,所有的子节点全部选中
就用了那个,当前选中事件,当我选择一个为true或为false
的时候,循环所有子节点
可是我每次循环选择一个的时候,该事件都会被激活
这样是可以做出来,可是觉得有点麻烦

不知道还有没有谁有更简单的方法谢谢赐教

解决方案 »

  1.   

    AfterCheck事件 只对你选中的那个节点有效吧 我就是这样用的 没好好看过
      

  2.   

    你激活AfterCheck事件后,假如父节点被选中了让子节点选中的话,同样子节点也会执行AfterCheck事件的
    就好像是一个递归调用的过程了
    如果要实现你说的功能就只能AfterCheck事件.所以没法了,自己多加点判断和控制就好了
      

  3.   

            private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                foreach (TreeNode tn1 in e.Node.Nodes)
                {
                    tn1.Checked = e.Node.Checked;
                }
            }
      

  4.   

       private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) 
            { 
    if not e.Node.Nodes is null(加个判断)            foreach (TreeNode tn1 in e.Node.Nodes) 
                { 
                    tn1.Checked = e.Node.Checked; 
                } 
            }
      

  5.   

    楼上两位的方法的确可以实现,选中某节点,其下所有子节点都选中,取消选中也可以还有2个问题:
    1.当取消选中某节点(如:A1)时,要同时取消其父节点(如:A)
    2.挨个儿选中某节点(如:B)下所有子节点(如:B1、B2...)时,该节点本身(即:B)要变成选中要完美解决这些问题,上述代码要如何完善呢?
      

  6.   

    测试了一下,没成功,发生死循环,代码如下:         private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                bool checkAll = true;              if (e.Node.Nodes != null)
                {
                    foreach (TreeNode tn in e.Node.Nodes)
                    {
                        tn.Checked = e.Node.Checked;
                    }
                }            if (e.Node.Parent != null)
                {
                    if (!e.Node.Checked)
                    {
                        e.Node.Parent.Checked = false;
                    }
                    else
                    {
                        foreach (TreeNode tn in e.Node.Parent.Nodes)
                        {
                            if (!tn.Checked)
                            {
                                checkAll = false;
                                break;
                            }
                        }                    e.Node.Parent.Checked = checkAll;
                    }
                }
            }说明:AfterCheck 事件,在任何时刻节点的Check状态改变都会触发,所以以上代码发生父子节点交叉影响,所以死循环寻求正解.........................