ASP: Repeater控件的Items.Count属性始终为零

3
我对ASP还比较陌生,这个问题让我有点困惑。我有一个重复器(basicInfoReport)与数据源(basicInfo)相连。这部分工作正常;重复器中的Eval调用返回了正确的数据。
我还有一些代码,意图是在页面上设置文本以替换<asp:Literal>。下面分别放了两个片段。
据我所知,重复器正在进行数据绑定(因为Eval调用起作用),所以我无法弄清楚为什么它报告零项,因此foreach语句什么也没做。有人能帮忙吗? :)
编辑:已解决,请参见更新后的代码。
ASP(删除了不相关的内容)
<asp:AccessDataSource ID="basicInfo" runat="server" 
    DataFile="~/Disasters.accdb" 
    SelectCommand="SELECT * FROM [DisasterTable] WHERE ([ID] = ?)">
    <SelectParameters>
        <asp:QueryStringParameter Name="ID" QueryStringField="ID" Type="Int32" />
    </SelectParameters>
</asp:AccessDataSource>

<asp:Repeater ID="basicInfoReport" runat="server" DataSourceID="basicInfo" 
    onitemdatabound="basicInfoReport_ItemDataBound">
<ItemTemplate>
<h2>Disaster report: <%#Eval("Description")#%></h2>
<b><i>This report is confidential.</i></b><br /><br /><br />

This event was reported on <tt><%#Eval("dateReported")#%></tt>. It was reported  <asp:Literal ID="_wasReportedAnonymously" runat="server"></asp:Literal> and is currently  <asp:Literal ID="_isEmergency" runat="server"></asp:Literal> classed as an emergency.
</ItemTemplate>
</asp:Repeater>

C# (irrelevant stuff removed)

protected void basicInfoReport_ItemDataBound(object sender, RepeaterItemEventArgs e) {

// [...]

// reader refers to an OleDbDataReader that is used for some database interaction in this method.
// until this point, basicInfoReport has not been referenced at all.
if (reader[1].ToString().Equals("False"))
   {

     // at this point basicInfoReport.Items.Count is always zero

     foreach (RepeaterItem repeaterItem in basicInfoReport.Items) {

       // control never makes it this far

       if (repeaterItem.ItemType == ListItemType.Item || repeaterItem.ItemType == ListItemType.AlternatingItem)
          {

             Literal emergencyLiteral = (Literal)repeaterItem.FindControl("_isEmergency");

             emergencyLiteral.Text = "not";
           }
      }
   }

 // [...]

 }

更新: 在almog.ori的帮助下解决了问题。供我参考,这是可用的代码:

C#(删除了不相关的内容)

protected void basicInfoReport_ItemDataBound(object sender, RepeaterItemEventArgs e) {

// [...]

// reader refers to an OleDbDataReader that is used for some database interaction in this method.
// until this point, basicInfoReport has not been referenced at all.
if (reader[1].ToString().Equals("False"))
   {

       if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
          {

             Literal emergencyLiteral = (Literal)e.Item.FindControl("_isEmergency");

             emergencyLiteral.Text = "not";
           }
      }

 // [...]

 }

你是在尝试获取项目数量吗?我在你提供的代码中没有找到那行代码。 - Muhammad Akhtar
在这段代码片段中,我并没有出现。但是如果你在注释的地方添加"int count = basicInfoReport.Items.Count",那么它将等于零(无论我运行时发生了什么)。 - Alex Ghiculescu
1个回答

2

你应该查看msdn文档中关于ItemDataBound事件的内容,特别注意事件参数的使用。

      void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {

      // This event is raised for the header, the footer, separators, and items.

      // Execute the following logic for Items and Alternating Items.
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {

事件ItemDataBound会将“行”传递给eventargs。所以你可以对它进行任何操作。您应该查看e.Item.DataItem,这将是绑定项目的数据项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接