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