1

我的页面上有一个中继器。它的项目上包含一个嵌套中继器。它的结构如下

<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>

我需要 countrptInnerRepeater的项目计数来代替评论。这可能使用Inline代码吗?

4

2 回答 2

0

既然您将中继器绑定到数据源,为什么不能操纵数据源以包含内部中继器绑定到的 SubItems 集合的计数?

你可以这样做:

<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>

你的数据源是:

  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 代码,这将非常适合您的需要。

于 2013-03-21T08:37:58.510 回答
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%>

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

希望这会有所帮助

于 2013-03-21T08:43:35.747 回答