Aviso aos navegantes:

Os posts que tinham referência para a "Página de Suporte" foram editados, e esta referência trocada por um download direto no final do post :-)

Qualquer coisa, gritem ae!

quarta-feira, 14 de outubro de 2009

Rapidinha: Visualizando propriedades em objetos lazy em um GridView

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<TNivel>.

Veja o trecho do XHTML abaixo:

<asp:GridView runat="server" id="gvNiveis">
	<Columns>
		<asp:BoundField HeaderText="Código" DataField="Id" />
		<asp:BoundField HeaderText="Descrição" DataField="Descricao" />
		<asp:BoundField HeaderText="Proximo" DataField="Proximo.Descricao" />
		<asp:BoundField HeaderText="Anterior" DataField="Proximo.Anterior" />
	</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 runat="server" id="gvNiveis">
	<Columns>
		<asp:BoundField HeaderText="Código" DataField="Id" />
		<asp:BoundField HeaderText="Descrição" DataField="Descricao" />
		<asp:TemplateColumn HeaderText="Proximo">
			<ItemTemplate>
				<asp:Label runat="server" ID="lbProx" Text='<%# DataBinder.Eval(Container.DataItem, "Proximo.Descricao") %>'></asp:Label>
			</ItemTemplate>
		</asp:TemplateColumn>
		<asp:TemplateColumn HeaderText="Anterior">
			<ItemTemplate>
				<asp:Label runat="server" ID="lbAnt" Text='<%# DataBinder.Eval(Container.DataItem, "Anterior.Descricao") %>'></asp:Label>
			</ItemTemplate>
		</asp:TemplateColumn>
	</Columns>
</asp:GridView>

Enfim, é isso aí!

Um abraço :-)

0 comentários:


Postar um comentário

Para tornar este artigo ainda mais interessante, escreva suas críticas (desde que construtivas e sem ofenças), elogios, sugestões, complementos, dúvidas, etc, etc, etc!!!

Sobre o NeoMatrix Tech

Meu blog para assuntos profissionais, ligado com tecnologia.
Dicas de programação (grande parte de C# e ASP.NET, mas não limitado a essa plataforma :-) ), dicas de utilitários, análises de equipamentos e serviços, resenhas sobre sites que eu visito, relacionados com tecnologia, opinião sobre mercado de trabalho, metodologias de desenvolvimento, comportamento no mundo tecnológico...

Arquivo

NeoMatrix Light

  © Blogger templates ProBlogger Template by Ourblogtemplates.com 2008 - Editado e configurado por Leonel F.

Voltar ao TOPO