-----------------Default.aspx--------------------
<form id="form1" runat="server">
<div>
<asp:Repeater runat="server" ID="rpt1">
<ItemTemplate>
<div>
<%#Eval("descricao") %>
</div>
</ItemTemplate>
</asp:Repeater>
<asp:LinkButton runat="server" Text="<< Ant" OnClick="Anterior" Style="float: left;margin-right: 8px" ID="lbtnAnt" /><div id="paginas" style="float: left; margin-right: 8px" runat="server"></div><asp:LinkButton runat="server" ID="lbtnProx" Text="Prox >>" OnClick="Proximo" />
</div>
</form>
--------------------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<Dados> lst = new List<Dados>();
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 ---