asp: repeater.items.count всегда равен нулю

#c# #asp.net

#c# #asp.net

Вопрос:

Я довольно новичок в ASP, и я немного озадачен этим. У меня есть repeater ( basicInfoReport ), связанный с источником данных ( basicInfo ). Эта часть работает нормально; Eval вызовы в repeater возвращают правильные данные.

У меня также есть некоторый код, который предназначен для установки текста вместо <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 # (удален ненужный материал)

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

 // [...]

 }
  

Комментарии:

1. Где вы пытаетесь получить количество элементов. Я не нашел эту строку кода из предоставленного вами кода.

2. В этом фрагменте кода это не так. Но если вы добавили «int count = basicInfoReport. Товары. Count » там, где находится комментарий, тогда он был бы равен нулю (в любом случае, это то, что происходит, когда я его запускаю).

Ответ №1:

Вам следует взглянуть на документацию msdn для события ItemDataBound, особенно обратите внимание на использование аргумента event.

       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, который будет элементом данных для привязываемого элемента