现在的位置: 首页 > 综合 > 正文

不一样的repeater嵌套

2012年08月13日 ⁄ 综合 ⁄ 共 2764字 ⁄ 字号 评论关闭

以前做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();

 

最终效果:

抱歉!评论已关闭.