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 :-)