Categorias

ASP.NET: Criando paginação com um Repeater no C#

Muitas vezes precisamos de listagens cada vez mais customizadas, o que inviabiliza a utilização do gridView, para o mesmo normalmente necessitamos utilizar o Repeater.

Porém o Repeater não possui uma paginação pronta como o GridView.

Nesse código implemento uma paginação customizada para o Repeater por Próximo, Anterior e também por numeração.

Ps: No exemplo eu utilizei uma lista de objetos preenchidos em um laço de repetição. A ideia é preencher uma lista de objetos com o seu Dataset por exemplo ou DataReader.

-----------------Default.aspx--------------------

<%#Eval("descricao") %>
--------------------Default.aspx.cs -------------------- using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Collections.Generic; public partial class _Default : System.Web.UI.Page { //Instancia o objeto de paginação PagedDataSource pgds = new PagedDataSource(); // Seta o numero total de paginas que serão exibidas na paginação int numeropaginas = 7; //Inicia em 3 para a primeira pagina, representa a diferença entre a numeração das paginas int numerop = 3; protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { //grava no ViewState pagina a primeira pagina da paginação e o numero total de paginas ViewState["pagina"] = 0; ViewState["numeropaginas"] = numeropaginas; } FillDados(); } private void FillDados() { // Preenche uma lista de objetos para servirem de dataSource do nosso repeater. //(Essa lista de objetos pode ser consumida por um dataset por exemplo) List lst = new List(); for (int i = 0; i < 200; i++) { Dados dados = new Dados(); dados.Descricao = "Registro " + i.ToString(); lst.Add(dados); } //Seta a fonte de dados do objeto de paginação como a nossa lista de objetos pgds.DataSource = lst; //Permite a paginação do objeto pgds.AllowPaging = true; //Seta a pagina atual do objeto como sendo nosso ViewState de pagina. pgds.CurrentPageIndex = Convert.ToInt16(ViewState["pagina"]); //Seta a quantidade de registros por página pgds.PageSize = 5; //Aqui eu limpo os controles da minha div para acrecentar novamente a numeção paginas.Controls.Clear(); //Utilizado para as primeiras páginas, pois nas primeiras páginas a numeração da paginação não se altera, if (Convert.ToInt16(ViewState["pagina"]) < numerop) { int cont = 0; while (cont < numerop) { int p = Convert.ToInt16(ViewState["pagina"]); if (p == cont) { numerop = p; break; } cont++; } } //Percorre do viewstate pagina menos o numero setado para os números anteriores a pagina atual até o viewstate numero de página for (int i = Convert.ToInt16(ViewState["pagina"]) - numerop; i <= Convert.ToInt16(ViewState["numeropaginas"]) - 1; i++) { if (Convert.ToInt16(ViewState["numeropaginas"]) > numeropaginas) { //Caso exista outra paginação anterior, ou seja, não sejam os primeiros números na exibição. if (i == Convert.ToInt16(ViewState["numeropaginas"]) - numeropaginas) { //Adiciona o link buttom ... para voltar para as primeiras páginas LinkButton lb2 = new LinkButton(); lb2.Text = "..."; lb2.ID = "...ant"; lb2.Command += new CommandEventHandler(PrimeiraPagina); paginas.Controls.Add(lb2); Label lbl = new Label(); lbl.Text = " "; paginas.Controls.Add(lbl); } } LinkButton lb = new LinkButton(); if (i == pgds.CurrentPageIndex) { lb.Text = "[" + (i + 1).ToString() + "]"; } else { lb.Text = (i + 1).ToString(); } lb.ID = i.ToString(); lb.CommandName = i.ToString(); lb.Command += new CommandEventHandler(Paginar); paginas.Controls.Add(lb); Label lbl2 = new Label(); lbl2.Text = " "; paginas.Controls.Add(lbl2); //Caso não seja a ultima numeração a ser exibida if (Convert.ToInt16(ViewState["numeropaginas"]) < pgds.PageCount) { if (i == Convert.ToInt16(ViewState["numeropaginas"]) - 1) { //Adiciona o Link Buttom ... para ir para as ultimas páginas da paginação. LinkButton lb2 = new LinkButton(); lb2.Text = "..."; lb2.ID = "...prox"; lb2.Command += new CommandEventHandler(UltimaPagina); paginas.Controls.Add(lb2); } } } //Seta a visibilidade do botão proximo e anterior de acordo com a primeira ou ultima pagina //Na ultima pagina não mostra o botão prox e na primeira não mostra o ant lbtnAnt.Visible = !pgds.IsFirstPage; lbtnProx.Visible = !pgds.IsLastPage; //Seta a fonte de dados do repeater como o nosso objeto de paginação. rpt1.DataSource = pgds; rpt1.DataBind(); } protected void UltimaPagina(object sender, CommandEventArgs e) { //Vai para a ultima página. ViewState["numeropaginas"] = pgds.PageCount; ViewState["pagina"] = pgds.PageCount - 1; numerop = numeropaginas - 1; FillDados(); } protected void PrimeiraPagina(object sender, CommandEventArgs e) { //Vai para a primeira página ViewState["numeropaginas"] = numeropaginas; ViewState["pagina"] = 0; FillDados(); } protected void Proximo(object sender, EventArgs e) { // Vai para a próxima página ViewState["pagina"] = Convert.ToInt16(ViewState["pagina"]) + 1; if (Convert.ToInt16(ViewState["numeropaginas"]) < pgds.PageCount && Convert.ToInt16(ViewState["pagina"]) > (numeropaginas - numerop - 1)) { ViewState["numeropaginas"] = Convert.ToInt16(ViewState["numeropaginas"]) + 1; } //se forem as ultimas paginas else if (Convert.ToInt16(ViewState["pagina"]) >= (pgds.PageCount - ((numeropaginas + 1) / 2))) { numerop = numeropaginas - (pgds.PageCount - Convert.ToInt16(ViewState["pagina"])); } else { numerop = numerop + 1; } FillDados(); } protected void Anterior(object sender, EventArgs e) { ViewState["pagina"] = Convert.ToInt16(ViewState["pagina"]) - 1; //Se não forem as primeiras nem as ultimas paginas if ((Convert.ToInt16(ViewState["pagina"]) < (pgds.PageCount - ((numeropaginas + 1) / 2))) && Convert.ToInt16(ViewState["numeropaginas"]) != numeropaginas) { ViewState["numeropaginas"] = Convert.ToInt16(ViewState["numeropaginas"]) - 1; } //Se forem as ultimas paginas else if (Convert.ToInt16(ViewState["pagina"]) >= (pgds.PageCount - ((numeropaginas + 1) / 2))) { numerop = numeropaginas - (pgds.PageCount - Convert.ToInt16(ViewState["pagina"])); } else { numerop = numerop - 1; } FillDados(); } protected void Paginar(object sender, CommandEventArgs e) { ViewState["pagina"] = e.CommandName; if (Convert.ToInt16(ViewState["pagina"]) < ((numeropaginas - 1) / 2)) { ViewState["numeropaginas"] = numeropaginas; int cont = 0; while (cont < ((numeropaginas - 1) / 2)) { int p = Convert.ToInt16(ViewState["pagina"]); if (p == cont) { numerop = p; break; } cont++; } } else if (Convert.ToInt16(ViewState["pagina"]) >= (pgds.PageCount - ((numeropaginas + 1) / 2))) { numerop = numeropaginas - (pgds.PageCount - Convert.ToInt16(ViewState["pagina"])); if (Convert.ToInt16(ViewState["pagina"]) < pgds.PageCount) { ViewState["numeropaginas"] = Convert.ToInt16(ViewState["pagina"]) + (pgds.PageCount - Convert.ToInt16(ViewState["pagina"])); } } else { ViewState["numeropaginas"] = Convert.ToInt16(ViewState["pagina"]) + ((numeropaginas + 1) / 2); numerop = 3; } FillDados(); } } --------------------Dados.cs------------------- public class Dados { //Aqui você pode acrecentar os atributos como as coluanas do seu dataset. Para o exemplo de paginação apenas utilizo uma coluna. private String descricao; public String Descricao { get { return descricao; } set { descricao = value; } } } // --- By Domingos Carreira De Paola 06/2009 ---

Arquivos para Download:

PaginandoRepeater.rar