Agrupando dados no controle ListView

No ASP.NET 1x e ASP.NET 2.o  datalist era o controle primário para exibir dados em grupo.No ASP.NET 3.5 nós temos um novo controle que toma conta dos dados agrupados.Neste artigo vou mostrar como agrupar dados usando o controle ListView.

O banco

Nosos banco consiste em duas tabelas,Customers e Orders .O diagrama do banco é mostrado abaixo:

A tabela Customers tem uma relação de um para muitos com a tabela Orders.Isso significa que um único comprador pode ter muitos pedidos.

Bind dos dados no ListView

Existem muitas maneiras de trazer os dados do banco,vou usar Linq to Sql como a camada de Acesso aos dados (DAL),mas sinta-se a vontade para mudar esse método.O código a seguir busca os dados no banco da tabela Customers e atribui estes para o ListView:

private void BindData()
{
using(var db = new NorthwindDataContext())
{
lvCustomerProducts.DataSource = from c in db.Customers
select c;
vlvCustomerProducts.DataBind();
}

}

Criando o controle ListView

Agora é hora e criar o controle ListView.Como nós precisamos agrupar os itens vamos usar o GroupTemplate quando formos especificar a estrutura dos itens.O ListView também tem a propriedade GroupItemCount que representa o número de itens agrupados.Primeiramente de uma olhada na implementação do ItemTemplate:

<asp:ListView ID=”lvCustomerProducts” ItemPlaceholderID=”itemPlaceHolder” GroupPlaceholderID=”groupPlaceHolder” runat=”server” GroupItemCount=”3″>

<LayoutTemplate>

<table>
<tr>
<td>
<table cellpadding=”15″>
<asp:PlaceHolder ID=”groupPlaceHolder” runat=”server”></asp:PlaceHolder>
</table>
</td>
</tr>
</table>

</LayoutTemplate>

</ListView>

O LayoutTemplate representa a estrutura geral do ListView.Este consiste no controle PlaceHolder que pode ser substituído pelo HTML contido no GroupTemplate.O GroupPlaceHolderID é também especificado no ListView.

O GroupTemplate usa um controle PlaceHolder que é mais tarde substituído pelo ItemTemplate.Você pode considerar o GroupTemplate como uma seção que mostra os dados na verdade utilizando o ItemTemplate.Entretanto você pode também editar o GroupTemplate.Aqui segue a implementação do GroupTemplate:

<GroupTemplate>

<tr>

<asp:PlaceHolder ID=”itemPlaceHolder” runat=”server”>
</asp:PlaceHolder>

</tr>

</GroupTemplate>

O itemPlaceHolder será substituído pelo conteúdo do ItemTemplate.A implementação do ItemTemplate segue abaixo:

<ItemTemplate>
<td>
<h3><%# Eval(“FirstName”) %> <%# Eval(“LastName”) %> </h3>

<asp:GridView BorderStyle=”None” ID=”gvProducts” AutoGenerateColumns=”false” runat=”server” DataSource = ‘<%# Eval(“Orders”) %>’>

<Columns>

<asp:BoundField DataField = “OrderName” HeaderText=”Order Name” />
<asp:BoundField DataField = “Quantity” HeaderText = “Quantity” />

</Columns>

<EmptyDataTemplate>
<div style=”background-color:lightgray”>No orders exists!</div>
</EmptyDataTemplate>

</asp:GridView>

</td>

</ItemTemplate>

Eu usei um controle GridView em separado pra mostrar os produtos do comprador.O comprador que não tiver produtos associados,com ele terá o EmptyDataTemplate mostrado em seu lugar.

O efeito obtido é mostrado abaixo:

Conclusão

Neste artigo nós aprendemos a usar o GroupItemTemplate uma caracteristica do controle ListView.O GroupTemplate permite mostrar os dados em pequenas seções especificadas pela propriedade GroupItemCount do controle ListView.

Valeu até a próxima!

Links:
Mais sobre o controle ListView

Anúncios

Erros Entity framework

Erro:Problem in mapping fragments each of the following columns…..is mapping to multiple conceptual side properties.

Geralmente esse ocorre em associação de duas chaves primárias de 2 tabelas diferentes.

Correção:É Preciso inserir a tag <ReferentialConstraint> no XML  do .edmx:

Eu tenho as seguintes tabelas:

Clique com o botão o botão direito no arquivo .edmx,escolha Abrir com…/Open with… –> XML Editor,e insira o seguinte código,(claro que depende do seu modelo de dados):

<Association Name=“EnqueteVoteEnquete>

<End Type=“First.EnqueteVote” Role=“EnqueteVote” Multiplicity=“0..1” />

<End Type=“First.Enquete” Role=“Enquete” Multiplicity=“1” />

<!– Necessário para corrigir o erro Mapping fragments………..conceptual properties–>

<ReferentialConstraint>

<Principal Role=“Enquete”>

<PropertyRef Name=“enquete_ID”/>

</Principal>

<Dependent Role=“EnqueteVote”>

<PropertyRef Name=“vote_ID”/>

</Dependent>

</ReferentialConstraint>

</Association>

Isso deve resolver o problema.

Erro:Erro no insert utilizando MySql.

Provavelmente o erro é no tipo da chave primária da tabela,que deve ser Int64.Vá no design do modelo .edmx,clique na Scalar Property que é a chave primária de sua entidade,aperte F4 e mude o tipo da EntityKey para INT64
Caso não de certo tente tirar o unsigned da coluna no banco.

Erro na associação entre uma foreign key que não é chave primária.

Esse erro ocorre porque uma foreign key que não seja primary key também,não pode ser declarada como Scalar property e “ponta” de uma association ao mesmo tempo.Você deve escolher entre um dos dois.Ex:Apague a scalar property da entidade e mantenha a associação.

Mais sobre o Entity framework:

Bom espero ter ajudado,até mais!

O que é LINQ? – Parte 1

O que é LINQ?

LINQ é um modelo de programação que permite a nós consultar e modificar dados independente da fonte de dados.É um conjunto de extensões que adicionam suporte nativo para consultas no .NET framework.Com suporte ao LINQ, ’queries’ tornaram-se ‘passageiros de primerira-classe no .NET framework.Possibilitando abstração de dados em diferentes dominios,LINQ  oferece uma maneira única de manusear dados.

Por que usar LINQ?

Hoje e sempre desenvolvedores são responsáveis por manusear dados em aplicações.Esses dados pertecem a diferentes dominios de dados e cada dominio vem com um único conjunto de regras para lidar EX:SQL é usado para bancos de dados relacionais,Xquery/DOM é usado pra manusear documentos XML e diferentes Application Programming Interface (APIs) são usados pra manusear arquivos de texto,objetos,gráficos,registros,diretórios ativos etc.Os desenvolvedores enfrentam o dilema de controlar diferentes dominios de dados com o mesmo propósito – o de manusear dados.Não seria bom ter um único conjunto de regras pra manusear  todas as nossas necessidades de dados.Aí é que entra o LINQ.LINQ oferece um modelo de programação unificado para manusear dados de diferentes fontes.Assim,podemos investir nossos esforços na camada de negócios  sem ter que ficar se preocupando com a sintaxe no manuseio dos dados.

LINQ  SINTAXE E FUNCIONAMENTO

Com LINQ,as noções de queries são agora conceitos do próprio .NET Framework.A sintaxe do LINQ  não  é só restrita a bancos de dados relacionais ao invés disso se aplica a uma ampla opção de dominio de dados.A seguir temos um exemplo de uma consulta em LINQ em um array de string:

string frutas = {“maca”,”banana”,”laranja”};

var query = from f in frutas where(f ==    “laranja” || f == “banana”) select foreach(var fruta in query)

{

ListBox1.Items.Add(fruta);
}

Vamos ver o que o código acima faz.Nós temos um array de strings e uma consulta do tipo SQL operando nesse array.A consulta retorna um subconjunto do array para um objeto do tipo var.O loop foreach passa pelos objetos e mostra o resultado.Simples não?

O ponto a se notar é que a mesma sintaxe acima pode ser aplicada a um banco de dados relacional,DataSets,Arquivos xml ou outro dominio de dados.Nossa interface para manusear os dados continua a mesma mas em outra ponta; nosso dominio de dados pode mudar dependendo de nossa necessidades.Essa habilidade de termos o mesmo conjunto de regras pra acessar dados entre diferente dominios é notável.Eu tenho certeza,que agora,você começou a perceber o poder do LINQ.

LINQ vem com diferentes tipos de providers para manusear diferentes dominios de dados.Não confunda a sintaxe do LINQ com diferentes providers.A sintaxe continua a mesma (com pequenas variações)entre diferentes providers.Mas as caracteristicas podem variar de um provider para outro ex:a mesma sintaxe LINQ vai servir tanto pra Node de um documento XML como uma linha de um Database.Cada provider é responsável por converter a expressão LINQ para uma forma compatível com a fonte de dados que está sendo utilizada.LINQ vem com os seguintes diferentes providers:

  • LINQ to Objects:Usado para  consultar coleções de objetos em memória
  • LINQ  to SQL:Usado para manusear dados do SQL SERVER e SQL SERVER COMPACT .
  • LINQ to Entities:Opera em entidade de objetos.
  • LINQ to DataSet:Pesquisa em datasets.
  • LINQ to XML:Manusear arquivos XML.

Em breve criarei a segunda parte,em futuros posts!