PUBLICIDADE

Autor

doo

Domingos Carreira de Paola

membro deste junho de 2009

Tags

Enquete

Qual é o melhor site de buscas da internet?
PUBLICIDADE

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--------------------

<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 ---


ArquivoTipoTamanhoHits 
PaginandoRepeater.rarArquivo RAR16,7 Kb464Baixar o Arquivo

Sim   Não   Este código foi útil para você?
NotaComentário
Ainda não foi enviado nenhum comentário.
Regras:
Os comentários seguem as seguintes regras:
  • Todos os comentários são enviados por membros cadastrados no site.
  • A pontuação de comentários de conteúdo do próprio membro não serão computados.
  • Os comentários serão pré-aprovados, porém a equipe do site revisará o conteúdo de todos os comentários podendo ser invalidados (inclusive a pontuação).
  • Os comentários precisam ter, obrigatóriamente, coerência sobre o conteúdo que será comentado.
  • O membro que atingir 5 comentários invalidados não poderá mais comentar dentro do site. Com isso o membro não poderá mais ganhar pontos com comentários.
  • Há um limite de 10 comentários por dia para cada membro.
  • Qualquer comentário após ter sido publicado poderá ser retirado através da opção ( denunciar)

Comente

     (ainda não tem cadastro? clique aqui!)


Máximo de 30 caracteres

Máximo de 255 caracteres
 

© 2006-2013 R&W Informática Ltda. - Todos os direitos reservados. - Política de Privacidade | Mapa do Site