Um dos mais importantes objetos para apresentação de dados no ASP.NET é o Repeater. A função do Repeater é mostrar uma coleção de dados compatíveis com as interfaces IEnumerable ou IListSource (dados de tabela de banco de dados, arquivo XML, lista de objetos,etc…) com poucas linhas de código e de maneira organizada.
O Repeater é dividido em cinco templates:
- HeaderTemplate: Conteúdo do cabeçalho do Repeater (não obrigatório);
- FooterTemplate: Conteúdo de rodapé do Repeater (não obrigatório);
- ItemTemplate: Conteúdo que irá ser exibido em cada loop do Repeater;
- AlternatingItemTemplate: Tem a mesma função do ItemTemplate, serve para diferenciar a exibição entre os loops (não obrigatório);
- SeparatorTemplate: Conteúdo que irá ser exibido entre os loops (não obrigatório).
Principais propriedades
- DataSource: Recebe a fonte de dados que o Repeater irá utilizar. Pode ser qualquer coleção que seja compatível com as interfaces IEnumerable ou IListSource, exemplos: consultas de banco de dados, dados de XML, lista de objetos, entre outras;
- Items: Essa propriedade é para ler a fonte de dados do Repeater.
Principais métodos
- DataBind(): Serve para que o Repeater renderize a fonte de dados informado na propriedade “DataSource” na página.
Principais eventos
- ItemCommand: Disparado quando um botão que esta dentro do repeater é clicado;
- ItemCreated: Disparado quando um item é criado pelo Repeater;
- ItemDataBound: Disparado antes de o Repeater renderizar as informações na página.
Exemplo simples
Vamos criar uma lista do tipo string para usar como uma fonte de dados para um Repeater.
Default.aspx
<asp:Repeater ID="rptAnimais" runat="server"> <ItemTemplate> <%# Container.DataItem %> </ItemTemplate> </asp:Repeater>
Default.cs
List<String> AnimaisLista = new List<String>();
AnimaisLista.Add("Cachorro");
AnimaisLista.Add("Gato");
AnimaisLista.Add("Galinha");
rptAnimais.DataSource = AnimaisLista ;
rptAnimais.DataBind();
O resultado será:
Como você pode observar, ele gerou um laço de repetição passando por todos os itens da fonte de dados que foi informado. Cada item foi representado pelo código <%# Container.DataItem %>:
Em cada ciclo do Repeater vamos ter o objeto Container, contendo as principais propriedades:
- ItemIndex: Índice dos ciclos do Repeater, começando do zero;
- DataItem: O objeto do ciclo do repeater. Nesse caso como informamos um objeto List<String> como fonte de dados, o DataItem do ciclo foi o objeto String.
Exemplo avançado
Neste exemplo iremos utilizar uma lista de objetos para a exibição, o evento ItemDataBound e como utilizar um Repeater dentro de outro.
Para esse teste vamos utilizar as seguintes classes modelo:
namespace WebApplication
{
public class Banda
{
public String Nome { get; set; }
public List<Album> AlbumLista { get; set; }
}
public class Album
{
public String Titulo { get; set; }
public DateTime Lancamento { get; set; }
public String Comentario { get; set; }
}
}
O detalhe nesse caso é que dentro do objeto Banda temos uma lista de objetos Album. Para exibir uma lista de bandas, irá ser necessário também exibir a lista de álbuns de cada banda também, para isso iremos utilizar um Repeater dentro de outro.
Default.cs
protected void Page_Load(object sender, EventArgs e)
{
//A lista de objetos é preenchida por um método
//que poderia vir de uma tabela do banco de dados
// ou um xml, por exemplo.
List<Banda> BandaLista = GetBandaLista();
//Setamos a função "rptBanda_ItemDataBound" para escutar o evento "ItemDataBound".
this.rptBanda.ItemDataBound += new RepeaterItemEventHandler(rptBanda_ItemDataBound);
//Informamos a fonte de dados, e que o Repeater deve renderiza-la.
this.rptBanda.DataSource = BandaLista;
this.rptBanda.DataBind();
}
Default.aspx
<asp:Repeater ID="rptBand" runat="server">
<HeaderTemplate>
<table>
<thead>
<tr style="background-color:#aaaaaa;">
<th>Id</th>
<th>Name</th>
<th>Album Name</th>
<th>Release Date</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<th><%# Container.ItemIndex + 1 %></th>
<th><%# DataBinder.Eval(Container.DataItem,"Name") %></th>
<th></th>
<th></th>
<th></th>
</tr>
<asp:Repeater ID="rptAlbum" runat="server">
<ItemTemplate>
<tr>
<th></th>
<th></th>
<th><%# DataBinder.Eval(Container.DataItem,"Title") %></th>
<th><%# ((WebApplication.Album)Container.DataItem).Release.ToShortDateString() %></th>
<th><%# String.IsNullOrEmpty((String)DataBinder.Eval(Container.DataItem, "Comment")) ? "No comment" : DataBinder.Eval(Container.DataItem, "Comment")%></th>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr style="background-color:#cccccc;">
<th></th>
<th></th>
<th><%# DataBinder.Eval(Container.DataItem, "Title")%></th>
<th><%# ((WebApplication.Album)Container.DataItem).Release.ToShortDateString() %></th>
<th><%# String.IsNullOrEmpty((String)DataBinder.Eval(Container.DataItem, "Comment")) ? "No comment" : DataBinder.Eval(Container.DataItem, "Comment")%></th>
</tr>
</AlternatingItemTemplate>
</asp:Repeater>
</ItemTemplate>
<FooterTemplate>
</tbody>
<tfoot >
<tr>
<th>Band Table 2013</th>
</tr>
</tfoot>
</table>
</FooterTemplate>
</asp:Repeater>
O resultado será:
Primeiramente, devemos observar o uso dos templates HeaderTemplate e FooterTemplate. Como aprendemos, não é obrigatório utilizá-los, sendo assim, poderíamos ter colocado o conteúdo de início e fim da tabela fora do Repeater sem problemas. O diferencial do uso desses templates é, caso a fonte de dados não contenha nenhum item, o conteúdo do HeaderTemplate e FooterTemplate não será exibido na página.
Também estamos usando o template AlternatingItemTemplate para a lista de álbuns, que na maioria dos casos irá ser o mesmo conteúdo do ItemTemplate, apenas diferenciando as cores. Particularmente, eu prefiro utilizar apenas o ItemTemplate, diferenciando o estilo por css, segue o exemplo:
<tr <%# Container.ItemIndex % 2 != 0 ? "class=\"alternado\"" : "" %>></tr>
A condição Container.ItemIndex % 2 != 0 identifica se o ciclo possui um índice par ou ímpar, e aplica um estilo caso o ciclo for de índice par. Caso você não conheça, estou utilizando o operador ternário, para fazer a condição na mesma linha, já que expressões de databinding <%# %> não suporta várias linhas de código. Caso o operador ternário não supre as suas necessidades, você deve utilizar o evento ItemDataBound para realizar suas operações, ou criar um evento específico e invocar dentro do operador como:
<%# MeuMetodo(DataBinder.Eval(Container.DataItem, "Title"))%>
No exemplo, você viu duas formas de imprimir o conteúdo de uma propriedade do objeto doloop:
1. Utilizando o método DataBinder.Eval(Container.DataItem, “NomeDaPropriedade”)
<%# DataBinder.Eval(Container.DataItem, "Title")%>
2. Fazendo um casting do objeto Container.DataItem
<%# ((WebApplication.Album)Container.DataItem).Release.ToShortDateString() %>
Conclusão
Com o Repeater evitamos usar os laços de repetição, como o for e o while, deixando assim o código de uma página *.aspx muito mais limpo. Com os eventos é possível ter controle total sobre o Repeater e com o que ele irá mostrar, tornando-o assim uma ferramenta muito útil e poderosa.





