DataList com paginação

O controle DataList do ASP.NET é uma mão da roda para exibir listagem de dados usando um layout menos “tabular”. Infelizmente o DataList não possui de forma nativa (como no GridView, FormView e DetailsView) uma opção para definir páginas de dados (paginação). Mas isso não é problema, pois podemos implementar “na unha” esse recurso.

Vamos lá.

Neste exemplo usei a tabela Products do banco de dados de exemplo Northwind que acompanha o SQL Server Express 2008. E a paginação é de 10 registros por página.

A seguir segue o código de definição de um DataList para listagem de registros vindos da tabela Products. Observe que adicionei ao FooterTemplate dois LinkButton para representar a navegação da paginação.

<asp:DataList ID="DataList1" runat="server">
    <FooterTemplate>
        [<asp:LinkButton ID="lkbtnAnterior" runat="server" onclick="lkbtnAnterior_Click"><< Anterior</asp:LinkButton>]
        [<asp:LinkButton ID="lkbtnProximo" runat="server"  onclick="lkbtnProximo_Click">Próximo >></asp:LinkButton>]
    </FooterTemplate>
    <ItemTemplate>
        ProductID: <%#DataBinder.Eval(Container.DataItem, "ProductID").ToString()%>
        <br />
        ProductName: <%#DataBinder.Eval(Container.DataItem, "ProductName").ToString()%>
        <br />
        UnitPrice: <%#DataBinder.Eval(Container.DataItem, "UnitPrice", "{0:C}").ToString()%>
        <hr />
    </ItemTemplate>
</asp:DataList>

O código C# abaixo representa um método criado na página para tratar a listagem dos dados, inclusive por fazer a paginação. O código por ser adaptado para qualquer realidade.

protected void ListarDados(string tipo)
{
    int tamanhoPagina = 10;
    int registroInicio = 0;

    if (ViewState["registroInicio"] != null)
        registroInicio = (int)ViewState["registroInicio"];

    if (tipo == "proximo")
        registroInicio += tamanhoPagina;
    else if (tipo == "anterior")
        registroInicio -= tamanhoPagina;

    if (registroInicio < 0)
        registroInicio = 0;

    SqlConnection con = new SqlConnection(@"Data Source=localhostSQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True");
    SqlCommand cmd = con.CreateCommand();
    cmd.CommandText = "SELECT PRODUCTID, PRODUCTNAME, UNITPRICE FROM PRODUCTS ";

    con.Open();

    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;
    DataTable dt = new DataTable();

    //Preenchendo o DataTable com a quantidade de registro que se pretende mostrar.
    da.Fill(registroInicio, tamanhoPagina, dt);

    //Tratando o fim da navegação
    if (tipo == "proximo" && dt.Rows.Count == 0 && registroInicio > 0)
    {
        registroInicio -= tamanhoPagina;
        da.Fill(registroInicio, tamanhoPagina, dt);
    }

    DataList1.DataSource = dt;
    DataList1.DataBind();
    con.Close();

    ViewState.Add("registroInicio", registroInicio);
}

O código abaixo implementa os botões de navegação.

protected void lkbtnAnterior_Click(object sender, EventArgs e)
{
    ListarDados("anterior");
}

protected void lkbtnProximo_Click(object sender, EventArgs e)
{
    ListarDados("proximo");
}

Para listar os dados e mostrar a primeira página, chame o método ListarDados sem informar as opções de navegação. Desta forma:


    ListarDados("");

Baixe aqui o exemplo.

Para deixar mais eficiente o recurso de paginação, recursos do próprio banco de dados como a funções TOP, FIRST, LAST e etc podem ser utilizados.

7 ideias sobre “DataList com paginação

  1. Andre Carrilho

    vlw André, ajudou bastante…eu implementei aqui e deu certo mas quando eu vou até o final da paginação de uma busca e faço uma nova, ele permanece nessa ultima paginação que eu acessei…ai pra voltar sempre do inicio,eu coloquei esta linha de código no click do botão de pesquisa (antes de chamar o método de busca)
    ViewState.Remove(“registroInicio”);

    Responder
  2. Pingback: Como fazer paginação no DataList com C# e MySQL |

  3. Pingback: Como fazer paginação com o DataList, C# e MySQL - Visual Studio

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *