private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck);
             if (e.Node.Parent != null && e.Node.Checked != e.Node.Parent.Checked)
            {
                bool childcheck = true;
                foreach (TreeNode childnode in e.Node.Parent.Nodes)
                {
                    if (childnode.Checked != e.Node.Checked) childcheck = false;
                }
                if (childcheck) e.Node.Parent.Checked = e.Node.Checked;
            }            if (e.Node.Nodes.Count > 0)
            {
                foreach (TreeNode childnode in e.Node.Nodes)
                {
                    childnode.Checked = e.Node.Checked;
                }
            }
            this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);
        }
这个是可以执行的语句,能帮我注释一下每行到底什么意思吗?找不到解释的文章。
因为我想把里面的功能改动一下,当子选项和父选项都已经打钩的时候,取消一个子选项的钩,父选项的钩也自动取消。

解决方案 »

  1.   

    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) 
            { 
                this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck); ///把事件减掉,防止死循环。
                if (e.Node.Parent != null && e.Node.Checked != e.Node.Parent.Checked) 
                { 
                    bool childcheck = true; 
                    foreach (TreeNode childnode in e.Node.Parent.Nodes) 
                    { 
                        if (childnode.Checked != e.Node.Checked) childcheck = false; 
                    } 
                    if (childcheck) e.Node.Parent.Checked = e.Node.Checked; ///当子选项都打钩或都不打勾的时候,父选项跟着打钩或不打勾。
                }             if (e.Node.Nodes.Count > 0) 
                { 
                    foreach (TreeNode childnode in e.Node.Nodes) 
                    { 
                        childnode.Checked = e.Node.Checked; ///设置所有的子选项跟父选项一样。
                    } 
                } 
                this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck); ///重新把事件加回来
            } 
      

  2.   

    就是一个节点选择问题。private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) 
            { 
                this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck); //除去treeView1_AfterCheck事件
                if (e.Node.Parent != null && e.Node.Checked != e.Node.Parent.Checked) //如果满足节点有父节点,状态和父节点选择状态不一样就执行if中间的代码            { 
                    bool childcheck = true; //变量childcheck 赋值为true                foreach (TreeNode childnode in e.Node.Parent.Nodes) //遍历当前所选择的节点的父节点下的所有节点                { 
                        if (childnode.Checked != e.Node.Checked) childcheck = false; //如果节点与选择节点的状态不一样,变量childcheck 赋值为false
                    }                 if (childcheck) e.Node.Parent.Checked = e.Node.Checked; //如果变量childcheck 为true ,即所有的节点都是选择的,父节点也成选择的状态
                }             if (e.Node.Nodes.Count > 0) //如果节点有子节点
                { 
                    foreach (TreeNode childnode in e.Node.Nodes) //将它子节点全部选择中
                    { 
                        childnode.Checked = e.Node.Checked; 
                    } 
                } 
                this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck); //把treeView1_AfterCheck事件重新加上
            } 
      

  3.   

    if (e.Node.Parent != null && e.Node.Checked != e.Node.Parent.Checked) 
                { 
                   
                    foreach (TreeNode childnode in e.Node.Parent.Nodes) 
                    { 
                        if (!childnode.Checked)
                           { e.Node.Checked=false; 
                                break;
                           }
                    } 
      
                } 
    这样改一下可以实现你要的功能。
      

  4.   


    错了,应该是if (e.Node.Parent != null )
                {
                 
                   
                        if (!e.Node.Checked)
                          {
                              e.Node.Parent.Checked=false;
                          }
                    
     
                }