Paginando dados utilizando Datalist

Utilizando o Visual Studio 2008, percebe-se que, os controles GridView, FormView e DetailsView já possuem o recurso de paginação integrado, porém, o Datalist não fornece wizards para paginação, sendo assim, a mesma deve ser criada de forma customizada utilizando o objeto PagedDataSource.
Perceba que, o exemplo que será mostrado neste artigo, permitirá uma paginação onde possui os botões “next” e “preview”, bem como os links para cada pagina criada e uma legenda informativa dizendo qual página está selecionada, veja na Figura 1 abaixo:
Figura 1 – Paginação Datalist
Figura 1 – Paginação Datalist
Confira as propriedades do PagedDataSource, perceba que existem outras propriedades como isFirstPage (ir para primeira página) e isLastPage (ir para última página).
Com o PagedDataSource, será permitido utilizá-lo em conjunto ao Datalist, Repeater, Dropdownlist, dentre outros, basta associar a ele uma fonte de dados e quantas informações por página este irá exibir, perceba pelo exemplo abaixo, utilizando um sqlDataSource:
Aspx:

<div style="float: left">
     <asp:Label ID="lblPaginasTopo" runat="server" Text="" ForeColor="Black" Font-Size="14px">         
     </asp:Label>
</div>
<div style="float: left; padding-left: 20px;">
     <asp:ImageButton ID="btnPrevTopo" runat="server" AlternateText="Voltar" OnClick="btnPrev_Click"
                    ImageUrl="~/design/bgBack.gif" Width="19px" Height="19px" />
     <asp:LinkButton ID="divLinks" runat="server" OnClick="link_Click"></asp:LinkButton>
     <asp:ImageButton ID="btnNextTopo" runat="server" AlternateText="Próximo" OnClick="btnNext_Click"
           ImageUrl="~/design/bgNext.gif" Width="19px" Height="19px" />
</div>

C#:
protected void Page_Load(object sender, EventArgs e)
  {
        GetData();
        if (!Page.IsPostBack)
        {
            GetData();
            if (ViewState["PagedDataSource"] != null)
            {
              createPaging((int)ViewState["PagedDataSource"]);
            }
        }
        else
        {
            if (ViewState["PagedDataSource"] != null)
            {
                createPaging((int)ViewState["PagedDataSource"]);
            }
        }
    }
    private void GetData()
    {
        PagedDataSource pgds = new PagedDataSource();   
pgds.AllowPaging = true;
        pgds.DataSource = sdsResultado.Select(DataSourceSelectArguments.Empty);     
        pgds.PageSize = 10;
     pgds.AllowPaging = true;
pgds.CurrentPageIndex = PaginaAtual;
       btnNextTopo.Enabled = !pgds.IsLastPage;
        btnPrevTopo.Enabled = !pgds.IsFirstPage;
      
lblPaginasTopo.Text = string.Concat("Página ", (PaginaAtual + 1).ToString(), " de ", pgds.PageCount.ToString());
        ViewState["PagedDataSource"] = pgds.PageCount;
       
dlResultado.DataSource = pgds;
        dlResultado.DataBind();
    }
    public int PaginaAtual
    {
        get
        {
            object o = this.ViewState["PaginaAtual"];
            if (o == null || (int)o < 0)
                return 0;
            else
                return (int)o;
        }
        set
        {
            this.ViewState["PaginaAtual"] = value;
        }
    }
    protected void createPaging(int pgds)
    {
        for (int i = 0; i < pgds; i++)
        {
            LinkButton link = new LinkButton();
            link.Text = (i + 1).ToString();
            link.ID = string.Concat("txt_", i.ToString());
            link.Click += new EventHandler(link_Click);
            divLinks.Controls.Add(link);
            LiteralControl space = new LiteralControl("&nbsp;");
            divLinks.Controls.Add(space);
        }
    }
    protected void link_Click(object sender, EventArgs e)
    {
        LinkButton link = (LinkButton)sender;
        PaginaAtual = Convert.ToInt32(link.Text) - 1;
        GetData();
    }
    protected void btnPrev_Click(object sender, ImageClickEventArgs e)
    {
        PaginaAtual--;
        GetData();
    }
    protected void btnNext_Click(object sender, ImageClickEventArgs e)
    {
        PaginaAtual++;
        GetData();
    }
Perceba que, na criação da página aspx, foram adicionados os seguintes componentes:


  • 1 Label - “lblPaginasTopo” , para que no método GetData(), esta receba o texto informando
    em qual página está o resultado da consulta;




  • 2 ImageButton - “btnPrevTopo” e “btnNextTopo”, sendo estes os botões de “preview”
    e “next”, que através de seus metodos de OnClick irão “navegar” pelo resultado;




  • 1 – LinkButton, “divLinks” que irá receber, através do método “createPaging” o link
    para cada página que foi encontrada de paginação.



  • Observando o método GetData(), perceba que “sdsResultado” é um sqlDataSource que contém o resultado de uma determinada consulta, e que “pgds.PageSize” irá informar quantos resultados por página serão exibidos.
    Com o texto acima, pode-se realizar uma simples, rápida e eficiente paginação de dados utilizando sqlDatasource em conjunto com Datalist.

    3 Responses so far.

    1. Renan says:

      Por favor,

      Vocês poderiam postar o mesmo método de paginação mas utilizando banco de dados?

      Valeu !!

    2. Unknown says:

      Cara... vc me ajudou muito, estou iniciando em programação e tava ficando maluco, pois tenho que apresentar um trabalho asp.net, um site de e-commerce e precisava usar paginação no datalist para não mostrar aquela enorme quantidade de produto, poxa, me ajudou muito vlw... parabéns pelo trabalho.
      att Lucas Bispo

    3. Parabéns pelo artigo.
      Ajudou muito!!!

    Leave a Reply