我的页面上有一个转发器。它包含一个嵌套的转发器。 它的结构如下
<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>
</td>
</tr>
</ItemTemplate>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
我需要计算rptInnerRepeater
的项目数来代替评论。这是否可以使用Inline
代码。
答案 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>
</td>
</tr>
</ItemTemplate>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
----------------以前的非工作解决方案
您可以尝试替换此行
// Need some code logic here for counting
这一个
<%#((Repeater)Container.FindControl("rptInnerRepeater")).Items.Count%>
未经测试,并且不确定它是否会起作用,但值得一试,我会说: - )
希望这会有所帮助