大家好,在treeview节点的checkbox问题,要求节点被选中的话,该节点的父节点和父节点的父节点一直到根节点都被选中,该节点的子节点也全被选中,当该节点下的全部子节点都未选中的话,该节点也被取消选中

解决方案 »

  1.   

    if(e.Node.Checked == true)
    {
    treeNode t;
    foreach(t in e.Node.Nodes)
    {
    t.Checked=true;
    }
      

  2.   

    http://community.csdn.net/Expert/topic/4755/4755347.xml?temp=.3931238
      

  3.   

    LZ请参考:http://wf5360308.cnblogs.com/articles/388805.html
      

  4.   

    if(e.Node.Checked == true)
    {
    treeNode t;
    foreach(t in e.Node.Nodes)
    {
    t.Checked=true;
    }
    } if(e.Node.Checked == false)
    {
    treeNode t;
    bool f;
    f=false;
    foreach(t in e.Node.Parent.Nodes)
    {
    if(t.Checked==true)
    {
    f=true;
    }
    } if(f==false)
    {
    e.Node.Parent.Checked = false;
    }
    }
      

  5.   

    我用VB.NET写的,给你转化了一下到C#不知道好用不,试试。TreeCaiDan是treeview控件
    private void TreeCaiDan_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e) 

     TreeNode TreeN; 
     TreeNode TreeP; 
     string[] strNode; 
     if (BoolCheck == false) { 
       if (e.Node.Nodes.Count > 0) { 
         TreeN = FindChildrenChk(e.Node); 
         if (!(TreeN == null)) { 
           foreach (int TreeP in TreeN.Parent.Nodes) { 
             if (e.Node.Checked == true) { 
               TreeP.Checked = true; 
             } else { 
               TreeP.Checked = false; 
             } 
           } 
         } 
       } 
     } 
     if (!(e.Node.Parent == null)) { 
       if (e.Node.Checked == true) { 
         BoolCheck = true; 
         e.Node.Parent.Checked = true; 
       } 
     } 
     BoolCheck = false; 
    } private object FindChildrenChk(TreeNode tvParent) 

     TreeNode tn = tvParent; 
     TreeNode NodeTemp = new TreeNode(); 
     NodeTemp = FindChildren(tvParent); 
     if (NodeTemp == tn) { 
       return null; 
     } else { 
       return NodeTemp; 
     } 
    }
      

  6.   

    参看
    http://blog.csdn.net/knight94/archive/2006/04/10/657658.aspx
      

  7.   

    chengpei_chen() 你的代码不完全,FindChildren()没有定义
      

  8.   

    duguguiyu1984能不能把代码发来看看,我对递归不太了解
      

  9.   

    忘了一个函数
        '   返回值第一个Children节点
        Private Function FindChildren(ByVal tvParent As TreeNode)
            Dim TreeNT As New TreeNode        If Not tvParent.Nodes.Count > 0 Then Return tvParent
            TreeNT = tvParent.Nodes.Item(0)
            Return TreeNT
        End Function
      

  10.   


            //当树的CheckBox状态改时
    private void PopedomManage_AfterCheck(object sender, TreeViewEventArgs e)
    {
    //当节点为叶子时,checkBox的值改变将保存改变的值
    if (e.Node.Nodes.Count == 0 )
    {
    this.AfterCheck -=new TreeViewEventHandler(PopedomManage_AfterCheck);
    TreeNode mytn = e.Node;
    upChecked(ref mytn);
    upNoChecked(ref mytn);
    this.AfterCheck +=new TreeViewEventHandler(PopedomManage_AfterCheck);
    }
    //当点击上级节点时,会联动下级节点
    System.Collections.IEnumerator myIEnumerator = e.Node.Nodes.GetEnumerator();
    while (myIEnumerator.MoveNext())
    {
    ((TreeNode)myIEnumerator.Current).Checked = e.Node.Checked;
    }
    }

    //下级节点有选中,则上级节点为选中
    private void upChecked(ref TreeNode mytn)
    {
    if (mytn.Parent == null)
    {
    return;
    }
    if (mytn.Checked == true)
    {
    mytn.Parent.Checked = true;
    //再调用本函数
    TreeNode mytnParent = mytn.Parent;
    upChecked(ref mytnParent);
    }
    } //下级全级没有选中,则上节为没有选中状态
    private void upNoChecked (ref TreeNode mytnNo)
    {
    if (mytnNo.Parent == null)
    {
    return;
    }
    System.Collections.IEnumerator myIEnumerator = mytnNo.Parent.Nodes.GetEnumerator();

    while (myIEnumerator.MoveNext())
    {
    if (((TreeNode)myIEnumerator.Current).Checked == true )
    {
    return;
    }
    }
    mytnNo.Parent.Checked = false;
    //再次调用本函数
    TreeNode mytnNoParent = mytnNo.Parent;
    upNoChecked (ref mytnNoParent);
    }
      

  11.   

    忘了要转为C# 的
    一开始的变量
    private bool BoolCheck = false;private object FindChildren(TreeNode tvParent) 

     TreeNode TreeNT = new TreeNode(); 
     if (!(tvParent.Nodes.Count > 0)) { 
       return tvParent; 
     } 
     TreeNT = tvParent.Nodes.Item(0); 
     return TreeNT; 
    }
      

  12.   

    http://jhtchina.cnblogs.com/articles/367597.html
      

  13.   

    chengpei_chen
      D:\welderprj\PowerWeldManageForm\WCH\Sysfun\Role.cs(312): “System.Windows.Forms.TreeNodeCollection”并不包含对“Item”的定义
      

  14.   

    我做的源代码是在VB中的,可能转化为C#时不全面,C#正在学习
      

  15.   

    szsymz你的代码里this.AfterCheck 没有定义啊
    是不是就是PopedomManage_AfterCheck啊
      

  16.   

    已经结贴,谢谢大家更谢谢szsymz