一直以来,客户需要在WEB上面显示嵌套的数据页面,如下图所示:

  而我们的项目全部统一采用DataGrid来进行数据的绑定显示.对于这种嵌套数据的显示,我一直头疼.在网上搜了N种方法:采用嵌套DataGrid...手动在数据绑定的时候进行一些额外操作分割单元格.....全部都麻烦得要死.今天总算在CodeProject上面找到一种方便点的方法:采用Repeater来解决这个问题.
    首先,来看下我的DataGrid中列的html代码:

< asp:BoundColumn Visible ="False" DataField ="ID" ></ asp:BoundColumn >
< asp:BoundColumn DataField ="OrganName" HeaderText ="部门名称" ></ asp:BoundColumn >
< asp:TemplateColumn HeaderText ="员工" >
   
< ItemTemplate >
       
< FONT face ="宋体" >
           
< asp:Repeater id ="Repeater1" runat ="server" DataSource ='<%# ((System.Data.DataRowView)Container.DataItem).Row.GetChildRows("parentchild") % > '>
               
< HeaderTemplate >
                   
< table >
               
</ HeaderTemplate >
               
< ItemTemplate >
                   
< tr >
                       
< td > <% # DataBinder. Eval (Container.DataItem, " [\ " EmployeeName \ " ] " ) %> </ td >
                   
</ tr >
               
</ ItemTemplate >
               
< FooterTemplate >
                   
</ table >
               
</ FooterTemplate >
           
</ asp:Repeater ></ FONT >
   
</ ItemTemplate >
</ asp:TemplateColumn >
其中的ID列表示机构的ID,用来和员工信息中的机构ID进行"关联".


再来看关键代码
                DataSet ds =new DataSet();

                DataTable dtOrgan
=new DataTable();
                dtOrgan.Columns.Add(
"ID",typeof(string));
                dtOrgan.Columns.Add(
"OrganName",typeof(string));
                ...
               
/*...往机构表中灌数据...*/
                ds.Tables.Add(dtOrgan);

                DataTable dtEmployee
=new DataTable();
                dtEmployee.Columns.Add(
"OrganID",typeof(string));
                dtEmployee.Columns.Add(
"EmployeeName",typeof(string));
                ...
               
/*...往员工表中灌数据...*/

                ds.Tables.Add(dtEmployee);
                ds.Relations.Add(
"parentchild",ds.Tables[0].Columns["ID"],ds.Tables[1].Columns["OrganID"]);
                dgList.DataSource
= ds.Tables[0].DefaultView;
                dgList.DataBind();

最主要的就是利用了DataSet的Relations的属性,通过属性来将父子表关联起来,然后进行数据的绑定.最后,在WEB上运行出来的效果如下所示: