Rapidinha: Visualizando propriedades em objetos lazy em um GridView
Leonel Fraga de Oliveira 14/10/2009 22:20

Se você utiliza como DataSource de um gridview uma coleção do tipo List<> ao invés de um DataTable, pode ter uma hora que teremos que listar propriedades que não são de tipos primitivos (como DateTime, string, int), e sim lazy com outros objetos.

Vamos pegar como exemplo a classe TNivel do artigo anterior. Iremos construir um GridView para listar as propriedades ID, Descrição, Próximo e Anterior, utilizando como DataSource do grid uma coleção do tipo List.

Veja o trecho do XHTML abaixo:

<asp:GridView id="gvNiveis" runat="server">
	<columns>
		<asp datafield="Id" headertext="Código" :BoundField />
		<asp datafield="Descricao" headertext="Descrição" :BoundField />
		<asp datafield="Proximo.Descricao" headertext="Proximo" :BoundField />
		<asp datafield="Proximo.Anterior" headertext="Anterior" :BoundField />
	</columns>
</asp:GridView>

Compile isso, e você será brindado com uma mensagem de erro.

Como pudemos ver no artigo anterior, as propriedades Proximo e Anterior são objetos do tipo TNivel, e ao listar os campos Descricao das propriedades Proximo e Anterior em um BoundColumn ele não aceita da forma que colocamos.

Como resolvemos isso sem apelar para o evento OnRowDataBound e preencher as células manualmente?

Solução:

Crie, para cada campo, uma TemplateColumn e dentro do ItemTemplate coloque um Label. Na propriedade Text de cada Label, coloque o seguinte comando:

Text='< %# DataBinder.Eval(Container.DataItem, "Nivel.Descricao") %>'

Com a diretiva DataBinder.Eval (parecida com a #Bind, que chegamos a utilizar em artigos anteriores), podemos fazer o Bind de objetos com lazy, que tenham enfim as propriedades com tipos primitivos.

Veja como ficou nosso grid:

<asp:GridView id="gvNiveis" runat="server">
	<columns>
		<asp datafield="Id" headertext="Código" :BoundField />
		<asp datafield="Descricao" headertext="Descrição" :BoundField />
		<asp headertext="Proximo" :TemplateColumn>
			<itemtemplate>
				<asp id="lbProx" runat="server" text="&lt;%# DataBinder.Eval(Container.DataItem, &quot;Proximo.Descricao&quot;) %&gt;" :Label></asp>
			</itemtemplate>
		</asp>
		<asp headertext="Anterior" :TemplateColumn>
			<itemtemplate>
				<asp id="lbAnt" runat="server" text="&lt;%# DataBinder.Eval(Container.DataItem, &quot;Anterior.Descricao&quot;) %&gt;" :Label></asp>
			</itemtemplate>
		</asp>
	</columns>
</asp:GridView>

Enfim, é isso aí!

Um abraço :-)

Leonel Fraga de Oliveira Leonel Fraga de Oliveira é formado em Processamento de Dados na Faculdade de Tecnologia de São Paulo (FATEC-SP - 2002) e anteriormente em Técnico em Eletrônica, pela ETE Professor Aprígio Gonzaga (lá em 1999).
Atualmente trabalha como Analista de Sistemas na Prefeitura Municipal de São Caetano do Sul - SP
Tem como hobbies DJing (também trabalha como DJ freelancer) e ciclismo, além da manutenção dos sites NeoMatrix Light e NeoMatrix Tech.
Gosta de música eletrônica, tecnologia, cinema (super fã de Jornada nas Estrelas), gastronomia e outras coisas mais.


Compartilhe nas redes sociais

   

Deixe seu comentário

comments powered by Disqus