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>

rptInnerRepeaterコメントの代わりに のアイテム数を数える必要があります。Inlineこれはコードを使用して可能ですか。

4

2 に答える 2

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 に答える
0

Since, you are binding your Repeater to a Datasource, Why cannot you manipulate your datasource to contain the Count of the SubItems Collection to which your inner repeater is bound?

You can do it this way:

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

and your DataSource is :

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

so why not modify your datasource collection to contain an extra field called Count?

on the client side, you will have to use very ugly javascript/jQuery code, which will be superbly specific to your need.

于 2013-03-21T08:37:58.510 に答える