Israel Aéce

Microsoft MVP, MCP, MCAD, MCTS, MCPD e MCT

My Links

Blog Stats

Archives

Post Categories

Links

Login

Evento ItemDataBound Data[Grid][List]

Muitas vezes necessitamos resgatar os valores que estão sendo inseridos no Data[Grid][List] para manipulações ou até mesmo efetuar verificações para exibir uma informação mais personalizada ou ocultar algum controle, etc. Tendo este cenário, uma solução seria utilizar o evento ItemDataBound destes controles. Este evento é disparado sempre quando uma nova linha é inserida no controle, durante o DataBind().

Mas para isso, algumas condições devem ser verificadas para que não ocorra um erro. A começar que devemos verificar o tipo da linha que esta sendo inserida no controle através do Enumerador ListItemType. Os dados estão sempre nas linhas do tipo Item ou AlternatingItem, para certificarmos que não seja estejamos inserindo ou tentando acessar um controle que não exista, mesmo porque muitas vezes não utilizamos as linhas do controle do tipo Header e Footer para inserir os dados da DB e sim para uma somatória, ou algo assim, que no caso do DataBind() devem ser desconsideradas.

Então, o código ficará desta forma:

[ VB.NET ]
    Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, _
        ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemDataBound
        If e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.Item Then
            '...
        End If
    End Sub

[ C# ]
  private void DataGrid1_ItemDataBound(object sender, 
      System.Web.UI.WebControls.DataGridItemEventArgs e)
   {   
       if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
          {
               //...
          }
   }

Feito essa verificação, devemos agora nos atentar para qual o tipo de fonte de dados está sendo passado para a propriedade DataSource do controle. Isso varia quando utilizamos DataSets e DataReaders, pois devemos fazer o Cast para o tipo de objeto correto. Vejamos abaixo as duas opções:

[ VB.NET ] [ DataSets ]
DirectCast(e.Item.DataItem, DataRowView).Item("NomeColuna")
DirectCast(e.Item.DataItem, DataRowView).Item(0)

[ C# ] [ DataSets ]
((DataRowView)e.Item.DataItem)["NomeColuna"]
((DataRowView)e.Item.DataItem)[0]

[ VB.NET ] [ DataReaders ]
DirectCast(e.Item.DataItem, DbDataRecord).Item("NomeColuna")
DirectCast(e.Item.DataItem, DbDataRecord).Item(0)

[ C# ] [ DataReaders ]
((DbDataRecord)e.Item.DataItem)["NomeColuna"]
((DbDataRecord)e.Item.DataItem)[0]

Lembrando que no caso do uso dos DataReaders, devemos importar o Namespace System.Data.Common para podermos utilizar a Classe DbDataRecord.

Com isso, já podemos ter acesso aos dados/colunas que estão sendo adicionados no nosso controle, e com isso, nos permite fazermos manipulações e até mesmo testarmos condicionais para exibir ou não uma mensagem mais personalizada para o usuário de acordo com esses dados vindos da DB.

posted on Saturday, June 26, 2004 3:43 PM

Feedback

# re: Evento ItemDataBound Data[Grid][List] 8/26/2004 9:38 PM Leandro de souza

mas como pego o nome da coluna 0 do data grid da linha q esta sendo inserida?

# re: Evento ItemDataBound Data[Grid][List] 3/18/2005 1:59 PM Rafael da Silva Ribeiro

Gostei Israel... soh uma complementação:

Eu normalmente utilizo collections para popular um Datagrid / Repeater, etc... Suponto que eu tenho uma classe ProdutoCollection que é uma collection da classe Produto eu posso utilizar:

//Recupera a collection de todos os produtos
ProdutoCollection produtos = Produto.BuscarTodos();

//Popula o DataGrid
DataGrid1.Datasource = produtos;
DataGrid1.DataBind;

E no evento DataBound:

//Faz o cast do DataItem para Produto.
((Produto)e.Item.DataItem)

e assim ter acesso ao objeto e seus membros :D

t+

# re: Evento ItemDataBound Data[Grid][List] 4/15/2005 2:23 PM Rodrigo Ferreira Cardoso

Legal gostei muito da materia deu para aprender bastante.

Valeu

# re: Evento ItemDataBound Data[Grid][List] 5/3/2006 9:06 PM Ricardo Filippetti

estou com um problema, eu tenho uma dropdownlist com autopostback=true, disparando o evento selectedindexchange, que estou criando dentro do itemcreated... so que qdo o evento eh disparado o itemdatabound nao eh executado e eu perco as manipulacoes q haviam sido feitas...

abraços

Ricardo

# re: Evento ItemDataBound Data[Grid][List] 5/5/2006 3:52 AM Israel Aece

Ola Ricardo,

Já tentou correr em debug para ver o que pode estar havendo?

Att,

# re: Evento ItemDataBound Data[Grid][List] 5/30/2006 1:38 PM Fernando Michelutti

Seus artigos são excelentes como sempre!
Ajudou muito!
Parabéns!
Abraços

# re: Evento ItemDataBound Data[Grid][List] 7/3/2006 9:24 PM Lissandra

Se eu precisar popular um grid com a informacao de uma coluna do repeater, como eu faço????
por exemplo:
a partir do cod_atividade que eu carrego no repeater eu preciso executar uma consulta sql para carregar o grid.

# re: Evento ItemDataBound Data[Grid][List] 7/4/2006 8:42 PM Israel Aece

Ola Lissandra,

Você se refere a recuperar um item que está dentro do Repeater?

# re: Evento ItemDataBound Data[Grid][List] 7/6/2006 5:00 PM Lissandra

Oi Israel!
Isso, queria pegar o cdo_atividade que esta sendo preenchido no repeater e com ele gerar um sql para preencher o grid, que deve ser montado a cada linha do repeater.
Eu tava querendo fazer tipo um grid master/detail, só que sem precisar clicar em informação nenhuma, já carregar tudo automaticamente na página quando ela for aberta.

# re: Evento ItemDataBound Data[Grid][List] 7/10/2006 1:19 AM Israel Aece

Ola Lissandra,

Você pode incluir um controle dentro do outro e no evento ItemDataBound do controle principal você recupera o valor do item corrente através do DataItem e, via FindControl, recupera o controle interno e gera a SQL para populá-la.

# re: Evento ItemDataBound Data[Grid][List] 7/10/2006 5:18 PM Lissandra

Olá Israel.
Tudo bem? Agora me diga, como eu recupero o código qe eu estou carregando no master através do DataItem? Tem como me mostrar um exemplo?

# re: Evento ItemDataBound Data[Grid][List] 7/10/2006 5:24 PM Israel Aece

Ola Lissandra,

Mas é exatamente isso que eu explico neste post.

# re: Evento ItemDataBound Data[Grid][List] 7/10/2006 6:02 PM Lissandra

Sim, mas o data source que preenche o segundo grid é uma instrução sql, como eu faço p/ juntar, a parte do direct cast não ficou muita clara p/ mim.
Estou fazendo o seguinte:
no itemdatabound do master:
Dim dgitem As DataGridItem
Dim strOrderid As String
Dim dgDetails As DataGrid
If e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.Item Then
strOrderid = DirectCast(e.Item.DataItem, DataRowView).Item("id_atividade")
'Convert.ToString(DgMaster.DataKeys(dgitem.ItemIndex))
dgDetails = CType(DgMaster.Items(e.Item.DataItem).FindControl("dgEdit"), DataGrid)
dgDetails.Visible = True
dgDetails.EnableViewState = True
'Carregando detalhes
Me.carregaDgDetails(dgDetails, strOrderid)' aonde eu carrego a consulta p/ gerar o grid enviando tb a id_atividade (strOrderid).
é assim que usa?
Desde já agradeço por sua ajuda!:)

# re: Evento ItemDataBound Data[Grid][List] 7/10/2006 6:29 PM Lissandra

Oi Israel! Ja consegui resolver...Obrigada!
Só que eu estou carregando o conteúdo do grid na mesma coluna que estou carregando a informação do master.... Como eu faço para carregar o grid uma coluna abaixo?

# re: Evento ItemDataBound Data[Grid][List] 7/10/2006 6:31 PM Lissandra

Obrigada Israel! Consegui! Agora a informação do grid detalhe esta carregando na mesma linha que a informação do master...tem como eu colocar isso uma linha abaixo??

# re: Evento ItemDataBound Data[Grid][List] 7/10/2006 6:47 PM Israel Aece

Ola Lissandra,

Tente convertendo a coluna em TemplateColumn e estruturando como deseja utilizando tabelas.

# re: Evento ItemDataBound Data[Grid][List] 7/10/2006 7:17 PM Lissandra

Obrigada Israel!
Consegui!

# re: Evento ItemDataBound Data[Grid][List] 2/3/2007 12:14 AM Alex

Estou o um erro na linha abaixo:
Me._total += DirectCast(e.Item.DataItem, DbDataRecord).Item("UnitPrice")

Erro Unable to cast object of type 'System.Data.DataRowView' to type 'System.Data.Common.DbDataRecord'.

Qual o problema ?

# re: Evento ItemDataBound Data[Grid][List] 2/3/2007 3:54 PM Israel Aece

Ola Alex,

Mas chegou a ler o meu post? Eu falo exatamente sobre isso.

# re: Evento ItemDataBound Data[Grid][List] 4/3/2007 9:20 PM Sergio Luiz

Estou com um problema em um GridView + DetailsView, qdo altero o registro no DetailsView o GridView não atualiza, sei que preciso utilizar o DataBind(), mas não sei como, poderia me ajudar?

# re: Evento ItemDataBound Data[Grid][List] 4/4/2007 12:19 AM Israel Aece

Ola Sergio,

Você precisará recarregar o GridView com os novos dados.

# re: Evento ItemDataBound Data[Grid][List] 4/4/2007 1:10 AM Sergio Luiz

Oi Israel, obrigado pela resposta, mas infelizmente eu não sei como faze-lo. Tentei:
GridView1.Databind() após o script de atualização mas dá erro.

# re: Evento ItemDataBound Data[Grid][List] 4/5/2007 1:31 AM Israel Aece

Ola Sergio,

Mas não é somente isso. Você precisa recarregar o GridView efetivamente, ou seja, buscando os novos dados da DB.

# re: Evento ItemDataBound Data[Grid][List] 4/5/2007 2:47 AM Sergio Luiz

Boa Tarde Israel, foi mais fácil do que eu imaginava. Utilizo o VWD2005 Express ... na configuração do SQLDataSource que ele coloca na pagina dei um duplo click e acrescentei:

Protected Sub SqlDataSource2_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataSource2.Selecting
Grade1.DataBind()
End Sub
End Class

Apenas "Grade1.DataBind()"... o resto já vem preenchido ... e ZAP ... atualiza automaticamente após :

Atualização/Exclusão/Inserção

Obrigado Israel pela Atenção e Parabéns pelo ótimo blog.

# re: Evento ItemDataBound Data[Grid][List] 8/8/2007 12:03 AM Luiz Antonio

Sou o LuizIta do forum msdn br

tentei utilizar o ItemDataBound acredito que apesar do erro que ocorreu esteja fazendo certo mas o dado do campo qtde é do tiponumerico e pela msg de erro ele tá pedindo para eu converter para string veja se estou fazendo o correto eo que a msg de erro diz e como posso corrigí-la





protected void Produto_ItemDataBound(object sender, DataListItemEventArgs e)

{

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

{

qtdemsg = (((DataRowView)e.Item.DataItem)["qtde"].ToString);// Essa é a linha do erro

}

}



msg de erro

Error 1 Cannot convert method group 'ToString' to non-delegate type 'string'. Did you intend to invoke the method? C:\Inetpub\wwwroot\cybersnet\publica\catalog_lwlocal\Default.aspx.cs 463 28 catalog


Fico no aguardo da solução e desde já agradeço

# re: Evento ItemDataBound Data[Grid][List] 8/8/2007 2:01 AM Israel Aece

Ola Luiz,

O correto é:

qtdemsg = (((DataRowView)e.Item.DataItem)["qtde"].ToString());

# re: Evento ItemDataBound Data[Grid][List] 8/8/2007 10:53 PM Luiz Antonio

OK ISRAEL, coloquei da forma que vc falou e corrigiu pelo menos o erro como pd se ver abaixo

protected void Produto_ItemDataBound(object sender, DataListItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
//int qtde;

qtdemsg = (((DataRowView)e.Item.DataItem)["qtde"].ToString());




}
}

Só que agora está acontecendo algo estranho como o meu codigo do meu DataList está em paginação, verifiquei que o valor do campo qtde de um registro está aparecendo sempre no proximo registro ex

no registro 1 da pag1 não aparece nada como valor

no registro 2 da pag1 aparece no campo qtde o valor do registro 1 e por aí vai

no primeiro registro ordenado da pag2 tb não aparece nada como valor

no segundo registro ordenado da pag2 ai aparece o valor que suponho que seja do registro anterior como corrijo isso

Poderia me ajudar (o codigo da paginação está no evento page_load de minha pagina assim)

isto está dentro do evento page load

// cria link "anterior" e "proximo" tem que ter na tela dois hyperlink "hpanterior e hpproxima"

if (!pg.IsFirstPage)

hpAnterior.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(atual - 1) + "&resolucao=" + paginapixel + "&busca=" + busca + "&palavrachave=" + palavrachave + "&pesquisaavancada=" + pesquisaavancada + "&codigoml=" + codigoml +"&lista="+ lista +"&lista1="+ lista1 +"&lista2="+ lista2 +"&lista3="+ lista3 +"&valorinicial="+ valorinicial +"&valorfinal="+ valorfinal +"&ordenar="+ ordenar;

if (!pg.IsLastPage)


hpProxima.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(atual + 1) + "&resolucao=" + paginapixel + "&busca=" + busca + "&palavrachave=" + palavrachave + "&pesquisaavancada=" + pesquisaavancada + "&codigoml=" + codigoml + "&lista=" + lista +"&lista1="+ lista1 +"&lista2="+ lista2 +"&lista3="+ lista3 +"&valorinicial=" + valorinicial + "&valorfinal=" + valorfinal +"&ordenar="+ ordenar;

apesar que acho que não tem nd a haver com a ordenação e exibição dos registros dentro do evento do ItemDataBound em td o caso se pd me ajudar desde já agradeço e fico no aguardo

# re: Evento ItemDataBound Data[Grid][List] 8/9/2007 3:36 AM Israel Aece

Ola Luiz,

Está um pouco confuso. Tem correr em debug para ver o que pode estar havendo.

# re: Evento ItemDataBound Data[Grid][List] 8/9/2007 4:28 AM Luiz Antonio

tem algum email em que eu possa ti enviar o codigo inteiro zipado para ver o que está acontecendo ti mando o bd tb..ok fico no aguardo...me facilitaria se vc me disse-se como fz o metodo REQUEST funcionar

TIPO

//Como coloco o dado da variavel ordenar
//que recupera dados de um metodo Request
//nas areas Protected Static RetornaQtde abaixo?
ordenar = (Request["ordenar"]);

dentro do protected como abaixo

//Variavel estatica que retorna o resultado
//da função/rotina no source RetornaPreço do Datalist

protected static string RetornaQtde(object obj)
{
//Como coloco uma variavel ou o metodo request
//como ex. abaixo nas areas protected static string RetornaQtde(object ojb)
//ordenar = (Request["ordenar"]);
//para não dar erro?



DataRowView dv = obj as DataRowView;



if (Convert.ToInt32(dv["qtde"]) < 1)
{

return string.Format("Produto Esgotado");
}
else
{
return string.Format(Convert.ToString(dv["qtde"])+ "Prods.");
}

de qq maneira fico agradecido se pd ajudar-me

# re: Evento ItemDataBound Data[Grid][List] 8/11/2007 9:14 PM Israel Aece

Ola Luiz,

Não entendi a sua explicação.

# re: Evento ItemDataBound Data[Grid][List] 8/14/2007 2:08 AM Luiz Antonio

Eu enviei um outro email há vc não sei se o recebeu explicando sobre o assunto com exs inclusive me notifique se recebeu? fico no aguardo

# re: Evento ItemDataBound Data[Grid][List] 8/14/2007 5:16 PM Israel Aece

Ola Luiz,

Sim. Assim que possível eu te retorno.

# re: Evento ItemDataBound Data[Grid][List] 9/24/2007 7:21 PM Wesley

Pesso ajuda sou o Wesleu do MSDN, e estou com um probleminha essa excessão como eu resolvo?
DataBinding: 'System.Data.DataRowView' não contém uma propriedade com o nome 'CodigoDocId'.

# re: Evento ItemDataBound Data[Grid][List] 9/24/2007 8:30 PM Israel Aece

Ola Wesley,

Como a mensagem de erro diz, você não possui um campo chamado CodigoDocId. Certifique-se disso.

# re: Evento ItemDataBound Data[Grid][List] 2/13/2008 9:04 PM Clito Fornaciari Neto

Sempre utilizo da WEB para fazer pesquisa.

Entro em sites como este e encontro pessoas focadas em divulgar seus conhecimentos sem nada pedir em troca.

Além de estar em débito com tantas pessoas que de uma forma ou de outra ajudaram a desenvolver meus sistemas.

A estas pessoas tenho uma enorme gratidão!!!
Obrigado Israel Aece

# re: Evento ItemDataBound Data[Grid][List] 9/27/2008 8:43 PM Tony Alysson

Ola amigos, estou com uma dificuldade para fazer um album de fotos. Eu criei uma tabela no banco onde é armazenada o nome das imagem.
Estrutura da Tabela
--------------------
coluna1 - data
coluna2 - comentario
coluna3 - foto1 (armazena nome da imagem)
coluna4 - foto2 (armazena nome da imagem)
...
-------------------
Crie um datalist e dentro da template adicionei os campos mencionados acima. Onde deve aparecer as imagem, coloquei um imagebutton. Bom as imagens são carregadas na tela no tamanho pequeno que coloquei 70px por 90px. Eu quero saber como faço para clicar nela e ela abrir um popup com o tamanho maior.

# re: Evento ItemDataBound Data[Grid][List] 9/29/2008 5:39 PM Israel Aece

Boas Tony,

Basta você criar uma função JS que abre uma popup via window.open, passando como parametro um codigo que identifica a imagem. Depois disso, no evento Load da popup, você carregue a mesma em um controle <img />.

Title  
Name  
Url
Box Code
Protected by FormShield
Comments