2013-03-21 33 views
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代码。

+0

什么样的数据类型是中继器的数据源? – Kao 2013-03-21 08:03:09

+0

它的'IList '...但我不认为会有任何使用数据源,而计算内联子项.. – 2013-03-21 08:04:49

+0

我猜你重复重复IList和subRepeater,重复存储在当前IList项目的孩子,否则我想我需要更多地解释subRepeater的目的。 – Kao 2013-03-21 08:10:02

回答

0

因为您将Repeater绑定到数据源,为什么不能操纵数据源来包含您的内部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> 

和你的数据源是:

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

那么为什么不修改您的数据源收集到包含称为计数一个额外的字段?

在客户端,您将不得不使用非常丑陋的javascript/jQuery代码,这将非常具体地满足您的需求。

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

未测试,并不确定它会工作,但值得一试我会说:-)

希望这会有所帮助

+0

不...不工作!!! – 2013-03-21 09:14:59

+0

@MayankPathak得到0或0的错误? – jbl 2013-03-21 09:16:06

+0

计数为0 .. – 2013-03-21 09:20:52