一直以来,客户需要在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上运行出来的效果如下所示: