如何获取嵌套转发器项目的数量

时间:2013-03-21 07:59:06

标签: c# asp.net count repeater nested-repeater

我的页面上有一个转发器。它包含一个嵌套的转发器。 它的结构如下

<asp:Repeater ID="rptOuterRepeater" runat="server" >
   <ItemTemplate>
            <tr >
              <td>
              // Need some code logic here for counting
              </td>
           </tr>
            <tr>
            <td>
                 <asp:Repeater ID="rptInnerRepeater" unat="server">
                <ItemTemplate>
                     <tr >
                        <td>
                          &nbsp;
                       </td>
                     </tr>
                  </ItemTemplate>
             </td>
            </tr>
     </ItemTemplate>
   </asp:Repeater>

我需要计算rptInnerRepeater的项目数来代替评论。这是否可以使用Inline代码。

2 个答案:

答案 0 :(得分:0)

因为您将Repeater绑定到数据源,为什么不能操纵数据源以包含内部转发器绑定到的SubItems Collection的Count?

你可以这样做:

<asp:Repeater ID="rptOuterRepeater" runat="server">
  <ItemTemplate>
      <table>
         <tr>
           <td>
              <%# Eval("Count") %>
           </td>
         </tr>
         <tr>
           <td>
              <asp:Repeater ID="rptInnerRepeater" runat="server" 
                      DataSource='<%# Eval("Items") %>'>
               <ItemTemplate>
               <tr>
                 <td>
                    <%# Eval("Id") %>
                </td>
               </tr>
       </ItemTemplate>
    </asp:Repeater>
   </td>
 </tr>
   </table>
</ItemTemplate>
</asp:Repeater>

并且您的DataSource是:

  var datasource = testList.Select(s =>
                                 new
                                 {
                                     Count = s.Items.Count,
                                     Items = s.Items,
                                     Id = s.Id
                                 }).ToList();
            rptOuterRepeater.DataSource = datasource;
            rptOuterRepeater.DataBind();

那么为什么不修改数据源集合以包含一个名为Count?

的额外字段

在客户端,您将不得不使用非常丑陋的javascript / jQuery代码,这将非常适合您的需求。

答案 1 :(得分:0)

我可以使用文字和ItemDataBound事件处理程序来进行简短编码。不是我称之为“内联”的东西,但我希望无论如何这都会有所帮助。

<script runat="server">
    void innerRpItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.DataItem != null)
        {
            var lit = (Literal) ((Control) sender).Parent.FindControl("count");
            lit.Text = string.IsNullOrWhiteSpace(lit.Text) ? "1" : (int.Parse(lit.Text) + 1).ToString();
        }
    } 
</script>

<asp:Repeater ID="rptOuterRepeater" runat="server" >
   <ItemTemplate>
            <tr >
              <td>
              // Need some code logic here for counting
              <asp:Literal runat="server" ID="count"/>
              </td>
           </tr>
            <tr>
            <td>
                 <asp:Repeater ID="rptInnerRepeater" runat="server" OnItemDataBound="innerRpItemDataBound" >
                <ItemTemplate>
                     <tr >
                        <td>
                          &nbsp;
                       </td>
                     </tr>
                  </ItemTemplate>
             </td>
            </tr>
     </ItemTemplate>
   </asp:Repeater>

----------------以前的非工作解决方案

您可以尝试替换此行

// Need some code logic here for counting

这一个

<%#((Repeater)Container.FindControl("rptInnerRepeater")).Items.Count%>

未经测试,并且不确定它是否会起作用,但值得一试,我会说: - )

希望这会有所帮助