Как получить доступ к элементу, к которому привязаны данные во время ItemDataBound?

Я хочу получить элемент, к которому привязаны данные, во время события ItemDataBound asp: Repeater.

Я попробовал следующее (это был непринятый ответ в вопрос о переполнении стека):

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Object dataItem = e.Item.DataItem;
    ...
}

но e.Item.DataItem имеет значение null.

Как я могу получить доступ к элементу, к которому привязаны данные во время события ItemDataBound. Я предполагаю, что событие ItemDataBound происходит, когда элемент привязан к данным.

Я хочу получить доступ к объекту, чтобы я мог предпринять шаги для управления тем, как он отображается, кроме того, объект может иметь дополнительные полезные свойства, позволяющие мне улучшить его отображение.

Отвечать

Инструмент имел право отвечать. Ответ заключается в том, что e.Item.Data допустимо только тогда, когда e.Item.ItemType равно (Item, AlternatingItem). В других случаях это недействительно. В моем случае я получал события ItemDataBound во время строк заголовка (или нижнего колонтитула), где нет DataItem:

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   // if the data bound item is an item or alternating item (not the header etc)
   if (e.Item.ItemType != ListItemType.Item && 
         e.Item.ItemType != ListItemType.AlternatingItem)
   {
      return;
   }

   Object dataItem = e.Item.DataItem;
   ...
}

person Ian Boyd    schedule 05.12.2008    source источник
comment
Я считаю, что событие запускается после привязки элемента к данным. Думаю, раньше я обращался к данным в событии PreRender. Хотя нужно будет проверить какой-то старый код   -  person Damien    schedule 05.12.2008
comment
Я лично предпочитаю делать это так, как был дан ответ, так как это легче понять, чем случайный возврат для выхода, особенно для пустого метода, такого как ItemDataBound. Мое справедливое мнение   -  person Mitchel Sellers    schedule 05.12.2008


Ответы (6)


Я сразу догадываюсь, что вам это нужно:

if (e.Item.ItemType == ListItemType.Item ||
    e.Item.ItemType == ListItemType.AlternatingItem)
{
    //Put stuff here
}

В конце концов, сам элемент может представлять строку верхнего или нижнего колонтитула.

person Programmin Tool    schedule 05.12.2008
comment
Да, это нужно на репитере - person Mitchel Sellers; 05.12.2008
comment
Да, я на самом деле редактировал это пару раз, потому что при тестировании он не потерпел неудачу без проверки, поэтому небольшой опыт работы с репитерами заставил меня подумать, что это не так. Конечно, я вроде как не добавлял заголовок для тестирования ... Великолепно. - person Programmin Tool; 05.12.2008

Я просто хотел добавить, что добился этого, выполнив следующие действия:

protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
      //determine if the row type is an Item
      if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
      {
        DataRowView row = (DataRowView)e.Item.DataItem;
        if (row["RowName"].ToString() == "value")
        {
          //INSERT CODE HERE
        }
      }
    }
person Quantum Dynamix    schedule 08.09.2010
comment
Это было более полезно для меня, потому что в нем есть пример того, как получить информацию о конкретном столбце на основе имени. - person Jacob Morris; 24.07.2015

Для ретранслятора

if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType...

Может быть изменено на:

if (e.Item.DataItem != null) ...
person Community    schedule 25.07.2009

Используйте динамический

 dynamic item = e.Item.DataItem;
 string style = item.Style;
person Akshay Mishra    schedule 22.12.2017

Если вы имеете дело с asp: ListView, вы можете сделать что-то вроде этого:

    protected void myLV_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType != ListViewItemType.DataItem)
        return;

    object dataItem = ((ListViewDataItem)e.Item).DataItem;

}

(В заголовке вопроса не упоминается asp: Repeater ... поэтому я подумал, что было бы полезно опубликовать код для asp: listview)

person Adam Douglass    schedule 11.03.2009
comment
Хотя в заголовке этого нет, но в первой строке вопроса есть; но StackOverflow благодарит вас за дополнительный полезный материал. - person Ian Boyd; 12.03.2009

Для репитера с настраиваемой привязкой шаблона; вы можете использовать следующий шаблон. Я использовал это, чтобы создать таблицу, которая разбивает каждый элемент данных на две строки для печати.

Repeater1.HeaderTemplate = new PrintTemplate(ListItemType.Header);
Repeater1.ItemTemplate = new PrintTemplate(ListItemType.Item);
Repeater1.AlternatingItemTemplate = new  PrintTemplate(ListItemType.AlternatingItem);
Repeater1.FooterTemplate = new PrintTemplate(ListItemType.Footer);

 public class PrintTemplate : ITemplate
{
    ListItemType templateType;

  public PrintTemplate(ListItemType type)
  {
     templateType = type;

  }
  public void InstantiateIn(System.Web.UI.Control container)
  {       
     Literal lc = new Literal();

     switch(templateType)
     {
        case ListItemType.Header:
           lc.Text = "<TABLE>";
           container.Controls.Add(lc);
           break;
        case ListItemType.Item:
        case ListItemType.AlternatingItem:
           //lc.Text = "<TR><TD>";
           lc.DataBinding += new EventHandler(TemplateControl_DataBinding);
           container.Controls.Add(lc);
           break;
        case ListItemType.Footer:
           lc.Text = "</TABLE>";
           container.Controls.Add(lc);
           break;
     }
  }

    private void TemplateControl_DataBinding(object sender,
    System.EventArgs e)
          {

              Literal lc;
              lc = (Literal)sender;
              RepeaterItem container = (RepeaterItem)lc.NamingContainer;
              ListItemType itmType = container.ItemType;

              //construct the repeater row using a custom function that switches on item type; HEADER vs ITEM vs ALTERNATINGITEM
              lc.Text += GetPopulatedRepeaterRow(dataInterface, container.DataItem, container.ItemType); 
              ...
person civilator    schedule 01.05.2015