vs2008 我从 数据库里面把这样的数据放到了datatable里面学校名 牛津大学 班级   小组名  学生名
  c1     g1     s1
  c1     g1    s2
  c2     g3     s3
我对datatable一行一行的处理
怎么得到  牛津大学
       c1
        g1
          s1
          s2
        g2
          s3
这样的形式呢
  

解决方案 »

  1.   

    你的数据写错了吧?
    是不是 :牛津大学
    --c1
    ----g1
    ------s1
    ------s2
    --c2
    ----g3
    ------s3
      

  2.   

    3级树,没必要使用treeview
    直接嵌套3个list或者repeater
      

  3.   

    根节点很容易用一个变量记录当前的班级和小组,假如为a, b然后循环Datatable的行如果班级值不为a,则添加班级节点到学校下面,同时把a的值记为当前班级添加当前小组到新的班级节点下,把b记为当前小组,再把学生添加到小组节点下如果班级的值为a
    判断小组是否为b
    如果为b,则把学生添加到小组下
    如果不为b,则新建小组节点,再添加学生
      

  4.   

    最笨的方法:
    DataTable dt1 = DB.GetTable("select distinct 班级 from table_name");
    DataTable dt2 = DB.GetTable("select distinct 班级, 小组 from table_name");
    DataTable dt3 = DB.GetTable("select 小组, 学生 from table_name");
    StringBuilder sb = new StringBuilder();
    foreach(DataRow row1 in dt1.Rows)
    {
    sb.AppendFormat("<div style='padding-left:10px'>{0}</div>", row1[0]);
    DataRow[] rows2 = dt2.Select("班级="+ row1[0]);
    foreach(DataRow row2 in rows2)
    {
    sb.AppendFormat("<div style='padding-left:20px'>{0}</div>", row2[1]);
    DataRow[] rows3 = dt3.Select("小组="+ row2[1]);
    foreach(DataRow row3 in rows3)
    {
    sb.AppendFormat("<div style='padding-left:30px'>{0}</div>", row3[1]);
    }
    }
    }
      

  5.   

    DataTable dt = new DataTable();
                 dt.Columns.Add("班级");
                 dt.Columns.Add("小组名");
                 dt.Columns.Add("学生名");
                 dt.Rows.Add("c1", "g1", "s1");
                 dt.Rows.Add("c1", "g1", "s2");
                 dt.Rows.Add("c2", "g3", "s3");
                 DataRow[] rows1 = dt.Select("");
                 for (int i1 = 0; i1 < rows1.Length; i1++)
                 {                 
                     treeView1.Nodes.Add(rows1[i1]["班级"].ToString());
                     DataRow[] rows2 = dt.Select("班级='" + rows1[i1]["班级"].ToString() + "'");
                     for (int i2 = 0; i2 < rows2.Length; i2++)
                     {                   
                         treeView1.Nodes[i1].Nodes.Add(rows1[i2]["小组名"].ToString());
                         DataRow[] rows3 = dt.Select("小组名='" + rows2[i2]["小组名"].ToString() + "'");
                         for (int i3 = 0; i3 < rows3.Length; i3++)
                         {                         
                             treeView1.Nodes[i1].Nodes[i2].Nodes.Add(rows3[i3]["学生名"].ToString());
                         }
                     }
                 }
      

  6.   

    我要的结果
    + 牛津大学 
        +c1 
         +g1 
            s1 
            s2 
       +c2 
         +g3 
         +s3
    点 + 展开。
    还有 是直接从  
    班级  小组名  学生名 
      c1    g1    s1 
      c1    g1    s2 
      c2    g3    s3 
    这个表 可以扩展出来 对应的班级id,小组id,学生id
    这样的表来得到结果。不是楼上说的 三个表。
    只要能实现,就可以。请给类似的代码,好吗。
      

  7.   

    我要的结果
    + 牛津大学 
        +c1 
         +g1 
            s1 
            s2 
       +c2 
         +g3 
         +s3
    点 + 展开。
    还有 是直接从  
    班级  小组名  学生名 
      c1    g1    s1 
      c1    g1    s2 
      c2    g3    s3 
    这个表 可以扩展出来 对应的班级id,小组id,学生id
    这样的表来得到结果。不是楼上说的 三个表。
    只要能实现,就可以。请给类似的代码,好吗。
      

  8.   


    有人说过“三个表”吗?DataTable dt1 = DB.GetTable("select distinct 班级 from table_name");
    DataTable dt2 = DB.GetTable("select distinct 班级, 小组 from table_name");
    DataTable dt3 = DB.GetTable("select 小组, 学生 from table_name");
    StringBuilder sb = new StringBuilder();
    foreach(DataRow row1 in dt1.Rows)
    {
    sb.AppendFormat(" <div style='padding-left:10px'><a href='javascript:show(this,\"{0}\")'>+</a> {0} </div>", row1[0]);
    sb.AppendFormat("<div id='div-{0}' style='display:none;'>", row1[0]);
    DataRow[] rows2 = dt2.Select("班级="+ row1[0]);
    foreach(DataRow row2 in rows2)
    {
    sb.AppendFormat(" <div style='padding-left:20px'><a href='javascript:show(this,\"{0}\")'>+</a> {0} </div>", row2[1]);
    sb.AppendFormat("<div id='div-{0}' style='display:none;'>", row2[1]);
    DataRow[] rows3 = dt3.Select("小组="+ row2[1]);
    foreach(DataRow row3 in rows3)
    {
    sb.AppendFormat(" <div style='padding-left:30px'>{0} </div>", row3[1]);
    }
    sb.Append("</div>");
    }
    sb.Append("</div>");
    } .js
    function show(layer, name)
    {
    var div = document.getElementById(name);
    if(div.style.display=="none"){
    div.style.display = "";
    layer.innerHTML = "-";
    }else{
    div.style.display = "none";
    layer.innerHTML = "+";
    }
    }
      

  9.   

    修改:
    var div = document.getElementById(name); 
    ==>
    var div = document.getElementById("div-"+ name); 
      

  10.   

    不好意思。我说的是 我现在只有一个 datatable,格式就是下面的
    班级  小组名  学生名 
      c1    g1    s1 
      c1    g1    s2 
      c2    g3    s3 
    没办法做成 三个 datatable,因为这个datatable已经是 n个表结合的结果了。
    不知道这样怎么实现。非常感谢楼上的。
      

  11.   

    DataTable dt = new DataTable();
                 dt.Columns.Add("班级");
                 dt.Columns.Add("小组名");
                 dt.Columns.Add("学生名");
                 dt.Rows.Add("c1", "g1", "s1");
                 dt.Rows.Add("c1", "g1", "s2");
                 dt.Rows.Add("c2", "g3", "s3");
                 DataRow[] rows1 = dt.Select("");
    treeView1.Nodes.Add("牛津大学");
                 for (int i1 = 0; i1 < rows1.Length; i1++)
                 {                 
                     treeView1.Nodes[0].Nodes.Add(rows1[i1]["班级"].ToString());
                     DataRow[] rows2 = dt.Select("班级='" + rows1[i1]["班级"].ToString() + "'");
                     for (int i2 = 0; i2 < rows2.Length; i2++)
                     {                   
                         treeView1.Nodes[0].Nodes[i1].Nodes.Add(rows1[i2]["小组名"].ToString());
                         DataRow[] rows3 = dt.Select("小组名='" + rows2[i2]["小组名"].ToString() + "'");
                         for (int i3 = 0; i3 < rows3.Length; i3++)
                         {                         
                             treeView1.Nodes[0].Nodes[i1].Nodes[i2].Nodes.Add(rows3[i3]["学生名"].ToString());
                         }
                     }
                 }