Há algum tempo eu mostrei como acessar o item que está sendo adicionado em um controle DataBound para fazer algum tipo de verificação durante a inserção dos dados no controle. Como é mostrado no post, a conversão deve ser feita de acordo com o tipo de fonte de dados que está sendo inserida no controle (DataTable, DataReader, objetos, etc). Mas e quando precisamos acessar um tipo anônimo que é projetado a partir de uma query LINQ?
this.GridView1.DataSource = from cliente in colecaoDeClientes
select new
{
Nome = cliente.Nome,
QualquerOutraInformacao = true
};
this.GridView1.DataBind();
No exemplo acima, não há um tipo efetivo em que podemos converter o DataItem que é passado como parametro para o evento, impossibilitando extrair o valor de uma determinada propriedade. Para contornar esse problema, podemos recorrer ao método estático Eval da classe DataBinder, passando o DataItem como parametro e o nome da propriedade a ser recuperada. O exemplo abaixo mostra como efetuar o acesso ao tipo anônimo no evento RowDataBound do controle GridView:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
((Button)e.Row.FindControl(“btn”)).Enabled =
Convert.ToBoolean(DataBinder.Eval(e.Row.DataItem, “QualquerOutraInformacao”));
}
}
Além de ser uma técnica late-bound e que usa Reflection em runtime, ainda há o problema de ser fracamente tipado, o que nos obriga a sempre efetuar a conversão explícita para garantir a compilação da aplicação.