【问题标题】:asp: repeater.items.count is always zeroasp:repeater.items.count 始终为零
【发布时间】:2011-05-01 13:10:17
【问题描述】:

我对 ASP 还很陌生,对此我有些困惑。我有一个连接到数据源 (basicInfo) 的中继器 (basicInfoReport)。这部分工作正常;中继器中的Eval 调用返回了正确的数据。

我还有一些代码隐藏,旨在设置文本来代替页面上的<asp:Literal>s。我在下面都放了sn-ps。

据我所知,中继器正在数据绑定(因为 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#(不相关的内容已删除)

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";
           }
      }

 // [...]

 }

【问题讨论】:

  • 您在哪里尝试获取项目计数。我没有从你提供的代码中找到那行代码。
  • 我不是,在这段代码中是sn-p。但是,如果您在注释所在的位置添加“int count = basicInfoReport.Items.Count”,那么它将等于零(无论如何,当我运行它时会发生这种情况)。

标签: c# asp.net


【解决方案1】:

您应该查看 ItemDataBound 事件的 msdn 文档,特别注意事件参数的用法。

      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 将事件参数中的“行”交给您。所以你可以用它做你喜欢的事。您应该查看 e.Item.DataItem 这将是被绑定项目的数据项

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 2012-01-16
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多