本帖最后由 chiele 于 2010-07-14 09:29:30 编辑

解决方案 »

  1.   

    用递归, 为什么还有个For循环?
    先搞明白递归的概念
      

  2.   

    因为要用到DataTable,数据你也不可能贴出来那么多。无法测试。只是给个建议,虽然不是什么很好的方法,但可能可以解决。public static void DropBind(int paterid, DropDownList droplist)
    {
        //这里垃圾回收一下,能不用的尽量回收,尽量避免堆栈溢出
         GC.Collect();
        ...
    }
      

  3.   

    递归获取无限分类到下拉框,嘿嘿
     DataSet ds2 = bll.GetList(" Paterid=" + Int32.Parse(ds.Tables[0].Rows[i]
    这句该可以不要了,递归的时候,还会再调一遍,无意义,不用判断了,直接调
     DropBind(Int32.Parse(ds.Tables[0].Rows[i]["id"].ToString()), droplist);
      

  4.   

    没有仔细看你的代码。随便会所几点递归基本上要注意:1. 不应该进入重复的子目标,否则就算你用世界上最巨大的电脑肯定也会栈溢出的。
    2. 如果可能,应该先处理那些预测堆栈深度较浅的分支,而不是较深的。
    3. 尾递归应该立刻花1分钟时间断然改为迭代(即goto语句)。
    4. 所有递归程序其实都可以通过形式化方式(用机器)改为迭代程序,在参数增加收集器就可以将递归逻辑改变。
      

  5.   


                public static void DropBind(int paterid, DropDownList droplist)
                {
                    XXXCMS.BLL.NewsClassTable bll = new XXXCMS.BLL.NewsClassTable();
                    DataSet ds = bll.GetList(" Paterid=" + paterid + " and VersionColumn='cn'");
                    if (ds != null && ds.Tables[0].Rows.Count > 0 )
                    {
                        string depth = ""; 
                        for (int j = 0; j < Int32.Parse(ds.Tables[0].Rows[0]["depth"].ToString()); j++)                 
                            depth = depth + "|-";
                        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                        {
                            ListItem list = new ListItem();
                            if (ds.Tables[0].Rows[i]["depth"].ToString() == "0")
                            {
                                list.Text = ds.Tables[0].Rows[i]["Title"].ToString();
                            }
                            else
                            {
                                list.Text = depth + ds.Tables[0].Rows[i]["Title"].ToString();
                            }
                            list.Value = ds.Tables[0].Rows[i]["id"].ToString();
                            droplist.Items.Add(list);
                            DropBind(Int32.Parse(ds.Tables[0].Rows[i]["id"].ToString()), droplist);
                        }
                    }
                }
    你的 XXXCMS.BLL.NewsClassTable 类.
    请在方法最后一行释放掉它的 bll 实例.
      

  6.   

    递归和嵌套循环可以互相转换的。
    或是自己用Stack类来创建一个栈模拟递归,这样绝对不会堆栈溢出。递归调用每次压栈的不止变量,还有函数调用信息。自己创建Stack<T>,这个是类,不会再栈上分配内存,所以不会堆栈溢出。
      

  7.   

    多用Using,
    实例化变量尽量放在多次操作的外面