public bool delCommodityType(int id)
         {
             ds = commodityTypeDAL.getCommodityTypeByParent(id);
             if (ds.Tables[0].Rows.Count > 0) 
             {  
                 foreach(DataRow dr in ds.Tables[0].Rows)
                 {
                     commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
                     delCommodityType(Convert.ToInt32(dr["id"]));
                 }
             }
             if (commodityTypeDAL.delCommodityType(Convert.ToInt32(id)) > 0)  
             {
                 return true;
             }
             return false;
         }我就不明白了 我调试的时候已经是跑到return true;这一步了,跑完后它又回到foreach里的commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
郁闷啊,求解。

解决方案 »

  1.   

                     foreach(DataRow dr in ds.Tables[0].Rows)
                     {
                         commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
                         if(delCommodityType(Convert.ToInt32(dr["id"]))) return true;
      

  2.   


    public bool delCommodityType(int id)
             {
                 ds = commodityTypeDAL.getCommodityTypeByParent(id);
                 if (ds.Tables[0].Rows.Count > 0) 
                 {  
                     foreach(DataRow dr in ds.Tables[0].Rows)
                     {
                         commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
                         if(!delCommodityType(Convert.ToInt32(dr["id"])))
                         {
                                break;
                         }
                     }
                 }
                 if (commodityTypeDAL.delCommodityType(Convert.ToInt32(id)) > 0)  
                 {
                     return true;
                 }
                 return false;
             }
      

  3.   

    public bool delCommodityType(int id)
             {
                 ds  此处要定义局部变量,不能用外面的变量= commodityTypeDAL.getCommodityTypeByParent(id);
                 if (ds.Tables[0].Rows.Count > 0) 
                 {  
                     foreach(DataRow dr in ds.Tables[0].Rows)
                     {
                         commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
                         delCommodityType(Convert.ToInt32(dr["id"]));
                     }
                 }
                 if (commodityTypeDAL.delCommodityType(Convert.ToInt32(id)) > 0)  
                 {
                     return true;
                 }
                 return false;
             }
      

  4.   

    自己顶自己。不够再加分。我只想知道为什么。如果我要跳出来我直接break,但是我就是不明白怎么回跳回去。
      

  5.   


    有点,因为你这里return true不一定是最外面的一个return true.
      

  6.   

    public bool delCommodityType(int id)
             {
                 ds = commodityTypeDAL.getCommodityTypeByParent(id);             if (ds.Tables[0].Rows.Count > 0) 
                 {  
                     foreach(DataRow dr in ds.Tables[0].Rows)
                     {
                         commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
                         delCommodityType(Convert.ToInt32(dr["id"]));
                     }
                 }
                 if (commodityTypeDAL.delCommodityType(Convert.ToInt32(id)) > 0)  
                 {
                     return true;
                 }
                 return false;         }
    因为LZ还没判断里面的就return 所以你的调试没用
      

  7.   


    public bool delCommodityType(int id)
        {
            //根据ID查询到信息,返回一个数据集
            ds = commodityTypeDAL.getCommodityTypeByParent(id);
            //如果有数据,就执行里面的操作,没有就跳过里面的循环,直接执行下面的操作
            if (ds.Tables[0].Rows.Count > 0)
            {
                //如果ID是唯一,那么这里应该只有一条数据
                //所以循环执行一次
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    //先执行删除操作(不去管是否执行成功)
                    commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
                    //在一次进入到delCommodityType方法,同样还是这个ID
                    delCommodityType(Convert.ToInt32(dr["id"]));
                    //如果上面的删除操作执行成功,那么这里返回的false,并且不可跳出循环,这里是一个死循环
                }
            }
            //根据编号删除信息;
            //不理解:上面明明查询不到数据,这一步肯定查询不到数据,所以返回的是false
            if (commodityTypeDAL.delCommodityType(Convert.ToInt32(id)) > 0)
            {
                return true;
            }
            return false;
        }
      

  8.   


    public bool delCommodityType(int id)
        {
            ds = commodityTypeDAL.getCommodityTypeByParent(id);
            if (ds.Tables[0].Rows.Count > 0)
            {
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
                    delCommodityType(Convert.ToInt32(dr["id"]));//在这一步进入了递归,楼主看见的return只是调用这里面得其中一次而已,并不是最外层的return;所以这里return后还是会接着走上一层的foreach,如果能继续,当然commodityTypeDAL.delCommodityType(Convert.ToInt32(id));就会执行了。在有时候想直接跳出来,没有返回值的情况下,直接用的return,而不是return true或false;不要混淆了
                }
            }
            
            if (commodityTypeDAL.delCommodityType(Convert.ToInt32(id)) > 0)
            {
                return true;
            }
            return false;
        }
      

  9.   


    public bool delCommodityType(int id)
        {
            //根据ID查询到信息,返回一个数据集
            ds = commodityTypeDAL.getCommodityTypeByParent(id);
            //如果有数据,就执行里面的操作,没有就跳过里面的循环,直接执行下面的操作
            if (ds.Tables[0].Rows.Count > 0)
            {
                //如果ID是唯一,那么这里应该只有一条数据
                //所以循环执行一次
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    //先执行删除操作(不去管是否执行成功)
                    commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
                    //在一次进入到delCommodityType方法,同样还是这个ID
                    delCommodityType(Convert.ToInt32(dr["id"]));
                    //如果上面的删除操作执行不成功,那么这里永远不都会继续这个循环,并且不可跳出循环,这里是一个死循环
                    //如果删除操作执行成功,这里讲执行两次,最后返回false;
                }
            }
            //根据编号删除信息;
            //不理解:上面明明查询不到数据,这一步肯定查询不到数据,所以返回的是false
            //更改理解:上面循环里面没有删除成功,则这里再一次删除,如果删除成功就返回true
            if (commodityTypeDAL.delCommodityType(Convert.ToInt32(id)) > 0)
            {
                return true;
            }
            return false;
        }
      

  10.   

    delCommodityType(Convert.ToInt32(dr["id"]));不过这里不是同一个ID 这个是用参数的ID来查询出来的下节点ID
      

  11.   

    我对你的代码改了下
    public bool delCommodityType(int id)
    {
      ds = commodityTypeDAL.getCommodityTypeByParent(id); 
      if (ds.Tables[0].Rows.Count > 0) 
      {
        foreach(DataRow dr in ds.Tables[0].Rows)
        {
        commodityTypeDAL.delCommodityType(Convert.ToInt32(id));
        delCommodityType(Convert.ToInt32(dr["id"]));
        }
        if (commodityTypeDAL.delCommodityType(Convert.ToInt32(id)) > 0) 
        {
           return true;
        }   }
       else
       {
          return false;
       }
    }
    这样就可以了