□aaaaa
   □ a
   □ b
   □ c 
□bbbbb
   □ d
   □ e
   □ f
   □ g
□ccccc
   □ h
   □ i
   □ j我的TreeView里面的结构看上面.........
我现在想问:
  1  选中父节点,选中它下面的所有子节点.........例: 选了aaaaa  就要选中a,b,c
  2  取消父节点,取消它下面的所有子节点.....
  3 选中一个子节点,选中子节点当前的父节点  选了a,就要选中aaaaa
  4  取消所有子节点,取消它们的父节点.... 取消了a,b,c  就要取消aaaaa希望有朋友帮我解决一下,感激不尽啊..................兄弟姐妹们 拜托啊......

解决方案 »

  1.   

    用递归在AfterCheck中加上selectnode(e.Node,e.Node.Checked)   
        
        
      Private   Sub   selectnode(ByVal   n   As   TreeNode,   ByVal   ck   As   Boolean)     
        If   Not   (n.Nodes.Count   =   0)   Then     
            n   =   n.LastNode     
            While   Not   (n   Is   Nothing)     
                n.Checked   =   ck     
                selectnode(n,   ck)     
                n   =   n.PrevNode     
            End   While     
        End   If     
      End   Sub
      

  2.   

    大哥,不要用VB的,用C#  
      

  3.   

      /// <summary>
            /// 全部节点check处理
            /// </summary>
            /// <param name="eTreeNode"></param>
            private void CheckAll(TreeNode eTreeNode)
            {
                tvAllDepAndCam.AfterCheck -= new TreeViewEventHandler(tvAllDepAndCam_AfterCheck);
                if (eTreeNode.Parent != null)
                {
                    CheckParent(eTreeNode);
                }
                //if (eTreeNode.Nodes.Count > 0)
                //{
                //    foreach (TreeNode mTN in eTreeNode.Nodes)
                //    {
                //        mTN.Checked = eTreeNode.Checked;            //        foreach (TreeNode mTNSub in mTN.Nodes)
                //        {
                //            mTNSub.Checked = mTN.Checked;
                //            CheckSub(mTNSub);
                CheckSub(eTreeNode);
                //        }
                //    }
                //}            tvAllDepAndCam.AfterCheck += new TreeViewEventHandler(tvAllDepAndCam_AfterCheck);
            }
            /// <summary>
            /// 父节点处理--我修改的
            /// </summary>
            /// <param name="eTreeNode"></param>
            private void CheckParent(TreeNode eTreeNode)
            {
                if (eTreeNode.Parent == null)
                {
                    return;
                }           // eTreeNode.Parent.Checked = eTreeNode.Checked;
                int i = 1;
                foreach (TreeNode mTN in eTreeNode.Parent.Nodes)
                {
                    if (mTN.Checked!=true)
                    {
                        i = 0;
                    }              
                }
                if (i == 1)
                {
                    eTreeNode.Parent.Checked = true;
                }
                else
                {
                    eTreeNode.Parent.Checked = false;
                }
                if (eTreeNode.Parent.Parent != null)
                {
                    CheckParent(eTreeNode.Parent);
                }
            }
            ///// <summary>
            ///// 父节点处理 -- 网上代码
            ///// </summary>
            ///// <param name="eTreeNode"></param>
            //private void CheckParent(TreeNode eTreeNode)
            //{
            //    if (eTreeNode.Parent == null)
            //    {
            //        return;
            //    }        //   eTreeNode.Parent.Checked = eTreeNode.Checked;        //    foreach (TreeNode mTN in eTreeNode.Parent.Nodes)
            //    {
            //        eTreeNode.Parent.Checked = (eTreeNode.Parent.Checked || mTN.Checked);
            //        if (mTN.Parent != null)
            //        {
            //            CheckParent(mTN.Parent);
            //        }
            //    }
            //}
            /// <summary>
            /// 子节点处理
            /// </summary>
            /// <param name="eTreeNode"></param>
            private void CheckSub(TreeNode eTreeNode)
            {
                foreach (TreeNode mTN in eTreeNode.Nodes)
                {
                    mTN.Checked = eTreeNode.Checked;
                    CheckSub(mTN);
                }
            }
    几种处理的方式你可以自己修改着做
      

  4.   

    /// <summary>
       ///     如果该节点是叶子节点,就检查该叶子节点的父节点是否被选中,如果没有将父结点设为选中状态。
       ///     如果该节点是父节点点,就检查该父节点点的父节点是否被选中,如果没有将父结点的父节点设为选中状态。
       ///     如果是取消该叶子节点,则检测该叶子节点的所有兄弟结点是否全部没有被选中。如果是就取消该节点的父结点的选中状态
       ///     如果点击的是父结点,则将该节点的所有字节点设置为该节点相同的状态
       /// </summary> 
       private void checkAllChild(TreeNode node)
       {
        this.treeView1.AfterCheck -= new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterCheck);
        TreeNode TempNode = null;
        TreeNode TempNode1 = null;
        bool   bNodeStatus = false; 
        if(node.Nodes.Count == 0)       //该节点是叶子节点
        {
         bNodeStatus = node.Checked;
         if(bNodeStatus)         //如果该节点被选中则将该节点父节点设置成为选中状态
         {
          TempNode = node.Parent;     
          while(TempNode != null)      //将它的所有父节点设定为选中状态
          {
           TempNode.Checked = true;   
           TempNode = TempNode.Parent;
          }
         }
         else           //如果是取消对该节点的选中状态
         {
          TempNode1 = node;
          TempNode = node.Parent;
          while(TempNode != null)
          {
           if(this.CheckCurrentLevelStatus(TempNode1) == -1) //如果全部是未选中状态
           {
            TempNode1.Parent.Checked = false;     //取消该节点的父节点的选中状态
           }
           TempNode1 = TempNode;
           TempNode = TempNode.Parent;
          }
         }
        }
        else            //如果操作的不是叶子节点
        {
        
         for(int i=0;i<node.Nodes.Count;i++)    //将父节点的所有子节点设置成父节点相同的状态
         {
          node.Nodes[i].Checked = node.Checked;
          this.treeView1.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterCheck);
          checkAllChild(node.Nodes[i]);
          this.treeView1.AfterCheck -= new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterCheck);
         }
         if(node.Checked == false)      //如果是取消对非叶子节点的选中
         {
          TempNode1 = node;
          TempNode = node.Parent;
          while(TempNode != null)
          {
           if(this.CheckCurrentLevelStatus(TempNode1) == -1) //如果全部是未选中状态
           {
            TempNode1.Parent.Checked = false;     //取消该节点的父节点的选中状态
           }
           TempNode1 = TempNode;
           TempNode = TempNode.Parent;
          }
         }
        }
        this.treeView1.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterCheck);
       }
       /// <summary>
       /// 函数功能: 检测与node同级的所有节点的状态
       ///     如果全部被选中返回    1
       ///     如果全部没有被选中返回 -1
       ///     其它情况返回     0 
       /// </summary>
       private int CheckCurrentLevelStatus(TreeNode node)
       {
        int CheckedCount = 0;    //记录被选中的节点的数目
        int unCheckedCount = 0;    //记录未被选中的节点的数目
        TreeNode tempNode = null;
        tempNode = node.Parent.FirstNode;
        while(tempNode != null)
        {
         if(tempNode.Checked)   
         {
          CheckedCount++;
         }
         else
         {
          unCheckedCount++;
         }
         tempNode = tempNode.NextNode;
        }
        if((CheckedCount != 0) && (unCheckedCount != 0))
        {
         return 0;
        }
        else if(CheckedCount == 0)
        {
         return -1;
        }
        else
        {
         return 1;
        }
       }   private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
       {
        this.checkAllChild(e.Node);
       }
    }
    }
      

  5.   

    Delphi有個類可以實現你的功能,或者你參照那個類寫一下,呵呵
      

  6.   


            private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                if (e.Node.Nodes.Count > 0)
                    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 = true;
                    else
                    {
                        bool uncheck = true;
                        foreach (TreeNode tn in e.Node.Parent.Nodes)
                        {
                            if (tn.Checked)
                            {
                                uncheck = false;
                                break;
                            }
                        }
                        if (uncheck)
                            e.Node.Parent.Checked = false;
                    }
                }
            }
    这个可以满足你所有要求了
      

  7.   

    解决了..............非常感谢ojlovecd ...........简单好用........多谢各位朋友支持