这是我目前遇到的一个非常奇怪的问题。
我的代码中有Repeater
,其中我填充了数据。这是按预期工作的。
在我的转发器上,我得到了一个像这样的OnItemDataBound:
<asp:Repeater ID="repeater" Visible="true" runat="server" OnItemDataBound="getOverlays">
<ItemTemplate>
<span><%#Eval("name") %></span>
</ItemTemplate>
</asp:Repeater>
我的转发器显示正确的数据,比如我的数据源包含三个名称,这些名称都应该在span标签中输出!到目前为止,一切正常。
现在出现了奇怪的部分。在我的getOverlays
函数中,我有以下代码:
protected void getOverlays(object sender, RepeaterItemEventArgs e) {
foreach (RepeaterItem item in repeater.Items) {
Response.Write(item.ItemIndex);
}
}
在我的世界里,这个空白会写出
0
1
2
但现在这行代码写出
0
0
1
对我来说这是一个很大的谜!以前有人遇到过这样的问题吗?我做错了什么?
我清楚地看到了我的数据源的3个名称,并且我做得到三个索引只是前两个索引获得相同的索引,即0。
我的索引在第一次迭代之后会被重置一些东西,但我之前从未遇到过这个问题,任何人都有这个问题的解决方案,或者能指出我为什么我的索引失真的正确方向?
提前谢谢。
答案 0 :(得分:3)
你不应该在OnItemDataBound事件中循环,它会自动为每个项目调用一次。相反,您应该使用e.Item.ItemIndex
。可能是第一次调用时,Repeater.Items
没有项目。第二次,有一个项目(索引= 0)。第三次,它有2个项目(索引0和1)。
答案 1 :(得分:2)
OnItemDataBound是在 之后调用的,每个 项都是数据绑定,而不是绑定所有数据。我认为你误解了这个事件的作用。
所以首先循环没有项目,第一项后0,然后0,1后。您将不得不调试它以查看它正在做什么,但这看起来是个问题。
答案 2 :(得分:2)
为绑定的每个项触发OnItemDataBound事件。所以你应该做下面的事情
protected void getOverlays(object sender, RepeaterItemEventArgs e) {
Response.Write(e.Item.ItemIndex);
}