现在从数据库中查询出来这样的数据id  name parentID 
1   a    0
2   b    0
3   c    0
4   d    1
5   e    4
6   f    2
7   g    1注:这里parentID对应着ID,这里还是多级关系。现在想重装成这样的数据:id  name parentID levelid
1   a    0        0
4   d    1        1
5   e    4        2
7   g    1        1
2   b    0        0
6   f    2        1
3   c    0        0
注:这里加了一列levelid,这列就是说明几层上级
另外,它的下级要直接排在它的下面。
各位帮忙看看。这是一个递归调用的问题,最主要的还是有个级别在那里不好处理。

解决方案 »

  1.   

    1.最好是在添加数据的时候在触发器中实现
    如果在程序中实现.首先查询这张表.
    排序按parentid,id排. 这样保存所有高级对象在前面,在后面处理时要先处理.然后循环datatable.对于每条记录,找它的parentid对应的记录如果有,取levelid +1更新到自己
    如果没有为 0不用递归。
      

  2.   

    谢谢慕白兄,现在我表中的数据就已经是id  name parentID 
    1   a    0
    2   b    0
    3   c    0
    4   d    1
    5   e    4
    6   f    2
    7   g    1这种形式了,数据重组只能在SQL和程序中进行处理了。 重组后的levelid列是后来加上去的。
      

  3.   

    DataTable dt = new DataTable();
            dt.Columns.Add("id",typeof(int));
            dt.Columns.Add("name");
            dt.Columns.Add("parentID",typeof(int));
            dt.Columns.Add("level",typeof(int));        int[] ary = new int[]{0,0,0,1,4,2,1};
            for(int i=0;i<6;i++)
            {
                DataRow row = dt.NewRow();
                row["id"]= i+1;
                row["Name"] = (char)('a'+i);
                row["parentID"] = ary[i];
                dt.Rows.Add(row);        }
            System.Web.UI.WebControls.DataGrid g = new System.Web.UI.WebControls.DataGrid();
            g.DataSource = dt.DefaultView;
            g.DataBind();        this.Panel1.Controls.Add(g);        for( int i=0;i<dt.Rows.Count;i++)
            {
                DataRow[] rows = dt.Select("id=" + dt.Rows[i]["ParentId"].ToString());
                if (rows.Length > 0)
                {
                    dt.Rows[i]["level"] = (int)rows[0]["level"] + 1;
                }
                else
                {
                    dt.Rows[i]["level"] = 0;
                }
            }
            g = new System.Web.UI.WebControls.DataGrid();
            g.DataSource = dt.DefaultView;
            g.DataBind();
            this.Panel1.Controls.Add(g);