刚刚解决一个"老大难"的问题,高兴ing~~~趁热记录下来~
一直以来,客户需要在WEB上面显示嵌套的数据页面,如下图所示:
而我们的项目全部统一采用DataGrid来进行数据的绑定显示.对于这种嵌套数据的显示,我一直头疼.在网上搜了N种方法:采用嵌套DataGrid...手动在数据绑定的时候进行一些额外操作分割单元格.....全部都麻烦得要死.今天总算在CodeProject上面找到一种方便点的方法:采用Repeater来解决这个问题.
首先,来看下我的DataGrid中列的html代码:
其中的ID列表示机构的ID,用来和员工信息中的机构ID进行"关联".< 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 >
再来看关键代码
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上运行出来的效果如下所示:
(没有写Repeater中Table的样式,稍微难看了些:)