Como acessar os dados que estão sendo itens ligados durante ItemDataBound?

StackOverflow https://stackoverflow.com/questions/344047

  •  19-08-2019
  •  | 
  •  

Pergunta

Eu quero ficar no item que está sendo ligado a dados, durante o evento ItemDataBound de um asp:. Repetidor

Eu tentei o seguinte (que era uma resposta inaceitável em uma stackoverflow pergunta ):

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

mas e.Item.DataItem é nulo.

Como posso acessar os dados que estão sendo itens ligados durante o evento chamado ItemDataBound. Presumo que o evento ItemDataBound acontece quando um item é ser dados vinculados.

Eu quero ir para o objeto para que eu possa tomar medidas para controlar a forma como ele é exibido, além do objeto pode ter propriedades úteis adicionais para deixar-me enriquecer como ele é exibido.

Resposta

Ferramenta tinha a resposta certa. A resposta é que e.Item.Data só é válida quando e.Item.ItemType é (Item, AlternatingItem). Outras vezes, não é válido. No meu caso, eu estava recebendo eventos ItemDataBound durante cabeçalho (ou rodapé) linhas, onde não há 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;
   ...
}

Foi útil?

Solução

Logo de cara eu teria que acho que você precisa isto:

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

Apesar de tudo, o item em si poderia ser representando uma linha de cabeçalho ou rodapé.

Outras dicas

Eu só queria acrescentar que eu tinha feito isso fazendo o seguinte:

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

Para repetidor

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

Pode ser modificado para:

if (e.Item.DataItem != null) ...

Use dinâmico

 dynamic item = e.Item.DataItem;
 string style = item.Style;

Se você está lidando com um asp: ListView, você pode fazer algo como isto:

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

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

}

(O título da pergunta não menciona um asp: repetidor .. então eu pensei que poderia ser útil para postar o código para um asp: listview)

Para um repetidor com um modelo personalizado vinculativo; você pode usar o modelo a seguir. Eu usei isso para criar uma tabela que divide cada item de dados em duas linhas para visualização de impressão.

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); 
              ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top