首页 新闻 搜索 专区 学院

一個惱人遞歸的問題?

0
悬赏园豆:15 [已解决问题] 解决于 2010-02-08 16:05

代碼如下:

private string detailHtml = "";
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("id");
            dt.Columns.Add("name");
            dt.Columns.Add("val");
            dt.Columns.Add("upid");
            dt.Rows.Add("1", "2009年", "2009年", "0");
            dt.Rows.Add("2", "2009Q1", "2009Q1", "1");
            dt.Rows.Add("3", "2009Q2", "2009Q2", "1");
           // dt.Rows.Add("4", "2009Q3", "2009Q3", "1");
            dt.Rows.Add("5", "200901", "200901", "3");
            dt.Rows.Add("6", "2010年", "2010年", "0");
            //dt.Rows.Add("7", "2010Q1", "2010Q1", "6");
            //dt.Rows.Add("8", "201001", "201001", "7");
            dt.Rows.Add("9", "2009001", "2009001", "5");
            dt.AcceptChanges();
            jsTree.InnerHtml = GetTreeHtml(dt);
        }
    }

    private string GetTreeHtml(DataTable dt)
    {
        string html = "<ul>{0}</ul>";
        DataView dv = new DataView(dt);
        dv.RowFilter = "upid=0";
        string roothtml = "";
        foreach (DataRowView dr in dv)
        {
            roothtml += "<li value='" + dr["val"].ToString() + "' style='margin-left:-28px;'><input type='checkbox' />"
                     + dr["name"].ToString() + GetDetailHtml(dt, dr["id"].ToString()) + "</li>";           
            detailHtml = "";
        }
        return string.Format(html, roothtml);
    }

    private string GetDetailHtml(DataTable dt ,string up_id)
    {
        DataView dv = new DataView(dt);
        dv.RowFilter = "upid=" + up_id;
        string html = "";       
        foreach (DataRowView dr in dv)
        {           
            detailHtml += "<li value='" + dr["val"].ToString() + "' style='margin-left:-28px;'><input type='checkbox' />"
                  + dr["name"].ToString() + "</li>";
            GetDetailHtml(dt, dr["id"].ToString());
        }
        html = "<ul>" + detailHtml + "</ul>"; 
        return html;
    }

運行的結果如下:

      2009年
         2009Q1
         2009Q2
         200901
         2009001
      2010年

正確的結果如下:

      2009年
         2009Q1
         2009Q2
              200901
                 2009001
      2010年

不知道怎麼修改,哪位大俠知道的告訴我一下,謝謝!

在此新春佳節來臨之際,祝博客園兄弟姐妹新年快樂,萬事如意!

soarfe的主页 soarfe | 初学一级 | 园豆:146
提问于:2010-02-08 15:28
< >
分享
最佳答案
0
代码
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 if (!IsPostBack)
4 {
5 DataTable dt = new DataTable();
6 dt.Columns.Add("id");
7 dt.Columns.Add("name");
8 dt.Columns.Add("val");
9 dt.Columns.Add("upid");
10 dt.Rows.Add("1", "2009年", "2009年", "0");
11 dt.Rows.Add("2", "2009Q1", "2009Q1", "1");
12 dt.Rows.Add("3", "2009Q2", "2009Q2", "1");
13 // dt.Rows.Add("4", "2009Q3", "2009Q3", "1");
14   dt.Rows.Add("5", "200901", "200901", "3");
15 dt.Rows.Add("6", "2010年", "2010年", "0");
16 //dt.Rows.Add("7", "2010Q1", "2010Q1", "6");
17 //dt.Rows.Add("8", "201001", "201001", "7");
18 dt.Rows.Add("9", "2009001", "2009001", "5");
19 dt.AcceptChanges();
20 jsTree.Text = GetTreeHtml(dt,0);
21 }
22 }
23
24 private string GetTreeHtml(DataTable dt,int pid)
25 {
26 string html = "<ul>{0}</ul>";
27 DataView dv = new DataView(dt);
28 dv.RowFilter = "upid="+pid.ToString();
29 string roothtml = "";
30 foreach (DataRowView dr in dv)
31 {
32 roothtml += "<li value='" + dr["val"].ToString() + "' style='margin-left:-28px;'><input type='checkbox' />"
33 + dr["name"].ToString() + GetTreeHtml(dt, Convert.ToInt32(dr["id"])) + "</li>";
34 detailHtml = "";
35 }
36 return string.Format(html, roothtml);
37 }

我这里的jstree是一个Literal

 

你的GetTreeHtml和GetDetailHtm,l我给你合并成一个GetTreeHtml

收获园豆:15
kkai | 菜鸟二级 |园豆:250 | 2010-02-08 15:53
謝謝你的解答,看了你的代碼我還是沒有找到我出現的問題的原因是什麽,請幫我分析一下,謝謝!
soarfe | 园豆:146 (初学一级) | 2010-02-08 16:02
對了 還不知道怎麼給分你呢?
soarfe | 园豆:146 (初学一级) | 2010-02-08 16:05
其他回答(1)
0

感觉太麻烦了,直接用Asp.net Tree控件不好吗

查尔斯 | 园豆:3832 (老鸟四级) | 2010-02-08 15:32
是有點麻煩哦!asp的tree控件是可以實現的,每次用它的時候,就搞不清tree裏面的遞歸的循環,所以想瞭解下,哪知一寫就出現問題了哦!
支持(0) 反对(0) soarfe | 园豆:146 (初学一级) | 2010-02-08 15:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册