以前做repeater嵌套数据绑定,
最典型的例子莫过于显示部门 然后在每个部门下显示所有员工 的例子。
你要问怎么做 好 百度一下,网上告诉你的例子都是 先给外面的repeater绑定部门数据,然后在部门的itemtemplate里再放repeater
然后再部门repeater 的OnItemDataBound里绑定对应的部门数据
like this:
DepBll是业务层类 已经写好的函数 用于根据部门编号获取对应员工信息 等。
protected void departs_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemIndex != -1) { DepBLL bll = new DepBLL(); Repeater emps = e.Item.FindControl("departs") as Repeater; int depid = int.Parse( (e.Item.FindControl("depid") as Label).Text); emps.DataSource = bll.selectEmpByDep(depid); emps.DataBind(); } }
上面那种的具体实现过程就不讲了,地球人都知道 网上搜一搜就可以了。 今天这里说的是另外一种方法,
链接:http://support.microsoft.com/default.aspx?scid=kb;en-us;306154
不用OnItemDataBound事件,直接绑定(前提当然 肯定 绝对 必须 是要用到那种 一对多 的持久化层映射)
以前用的是nhibernate ,现在更好了有entityFrameWork,实体层一句代码不用写
实体层代码参考
departInfo中对员工表映射实体的定义(vs2008自动生成的):
/// <summary> /// 架构中不存在 empInfo 的注释。 /// </summary> [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("BosloyERPModel", "FK__empInfo__departI__2EDAF651", "empInfo")] [global::System.Xml.Serialization.XmlIgnoreAttribute()] [global::System.Xml.Serialization.SoapIgnoreAttribute()] [global::System.Runtime.Serialization.DataMemberAttribute()] public global::System.Data.Objects.DataClasses.EntityCollection<empInfo> empInfo { get { return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection<empInfo>("BosloyERPModel.FK__empInfo__departI__2EDAF651", "empInfo"); } set { if ((value != null)) { ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection<empInfo>("BosloyERPModel.FK__empInfo__departI__2EDAF651", "empInfo", value); } } }
在页面repeater控件嵌套的时候可以这样绑定,
页面上其他代码我就不贴了,只贴数据绑定的代码:
关键部分( <asp:Repeater ID="employees" DataSource='<%# ((BosloyERPModel.departInfo)Container.DataItem).empInfo %>' runat="server">)
<asp:Repeater ID="departs" runat="server" onitemdatabound="departs_ItemDataBound"> <ItemTemplate><tr> <td> <a onclick="showdialog(<%#Eval("id") %>)" > <%# Eval("departName") %> </a> </td> <td style="padding-left:0px;" colspan="6"> <table width="100%"> <asp:Repeater ID="employees" DataSource='<%# ((BosloyERPModel.departInfo)Container.DataItem).empInfo %>' runat="server"> <ItemTemplate> <tr> <td width="14%" > <a onclick="showdialog2(<%#Eval("id") %>)" ><%#Eval("truename") %></a> </td> <td width="14%" > <%# Eval("gender")==null||(bool)Eval("gender")==false?"女":"男" %></td> <td width="14%" > <%# Eval("birthday")==null?0:(DateTime.Today.Year - ((DateTime)Eval("birthday")).Year)%></td> <td width="14%" > 职位</td> <td width="14%" > <%#Eval("mobilephone") %></td> <td width="14%" > 入职时间</td> </tr> </ItemTemplate> </asp:Repeater> </table> </td> </tr></ItemTemplate> </asp:Repeater>
在后台直接绑定部门数据就行了,当然要联动载入员工数据(include(“empinfo”)),就像在nhiernate里设置lazy=false 一样。
departs.DataSource = db.empInfo.Include("departinfo").ToList(); ; departs.DataBind();
最终效果: