ADO.NET -  Paginação de  dados


Em meu artigo - ASP.NET - Paginando dados em um DataGrid - tratei de mostrar como efetuar a paginação em um DataGrid em páginas ASP.NET. Vou agora fazer a mesma coisa para formulários Windows.

A paginação em formulários Windows de dados  que são exibidos em um DataGrid é possível e é uma tarefa relativamente simples. Isto por que o método Fill do objeto  DataAdapter fornece um método sobrecarregado que retorna somente um número selecionado de linhas em um DataSet. O código deste método é exibido a seguir:

Overloads Public Function Fill(ByVal dataSet As DataSet, _
   ByVal
startRecord As Integer, _
   ByVal
maxRecords As Integer, _
   ByVal
srcTable As String _
) As
Integer

Onde :

Nota: Para saber mais sobre sobrecarga e conceitos OO no VB.NET leia o artigo : VB .NET - Primeiros passos - Conceitos - VI

Então para obter a paginação devemos usar este método sobrecarregado. Faremos isto implementando uma função chamada obtemDadosPagina que irá retornar os registros da tabela Products do banco de dados Northwind do SQL Server.

Abaixo temos o código da função:

Function obtemDadosPagina(ByVal da As SqlDataAdapter, ByVal idx As Integer, ByVal size As Integer) As DataSet
    Dim ds As DataSet = New DataSet()
    Try
      da.Fill(ds, idx, size, "Products")
    Catch e As Exception
      MessageBox.Show(e.Message.ToString())
    End Try
    Return ds
End Function

Crie então um novo projeto no VS.NET do tipo Windows Application usando a linguagem VB.NET e no formulário padrão inclua os seguintes controles :

  , conforme o layout da figura abaixo:

Como vamos realizar uma conexão com o banco de dados Northwind do SQL Server vamos precisar do seguinte import:

Imports System.Data.SqlClient

Teremos que definir algumas variáveis da aplicação no início do formulário:

Dim strconn As String = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind"

Dim conn As SqlConnection

Dim da As SqlDataAdapter

Dim ds As DataSet

Dim tamanhoPagina As String

Dim indiceAtual As Integer

Dim totalregistros As Integer

Dim sql As String

Destacamos a string de conexão com o SQL Server.

No evento Load do formulário vamos incluir a rotina que preenche a combobox com algumas valores que poderão ser escolhidos pelo usuário para indicar quantos registros ele deseja que seja exibidos por vez.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim i As Integer

'preenche o combo com valores ate 20

For i = 0 To 20 Step 1

     cboTamanho.Items.Add(i)

Next

'define a opção que sera exibida na combo

cboTamanho.SelectedIndex = 9

End Sub

 

O código do botão Carregar é que irá fazer todo o serviço , usando a função obtemDadosPagina já definida acima.

Private Sub btnCarregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarregar.Click

        'converte o valor para um inteiro
        tamanhoPagina = Convert.ToInt32(cboTamanho.Text.ToString())

        ' Cria e abrea uma conexao
        conn = New SqlConnection(strconn)
        conn.Open()

        ' descobre o numero total de registros
        Dim cmd As SqlCommand = New SqlCommand

        ' define o comando SQL para contar os registros da tabela Products
        cmd.CommandText = "SELECT Count(*) FROM Products"
        cmd.Connection = conn

        ' chama ExecuteNonQuery no objeto Command Object para executar o SQL
        totalregistros = cmd.ExecuteScalar()

        ' Cria um data adapter e um instrução select para a tabela Products
        sql = "SELECT ProductID, ProductName, UnitPrice " & "FROM Products ORDER BY ProductID"

        'cria um novo DataAdapter para a conexão com a instrução SQL
        da = New SqlDataAdapter(sql, conn)
        ds = New DataSet

          'chama a função que retorna o número de registro definidos pelo usuário por vez
         ds = obtemDadosPagina(da, indiceAtual, tamanhoPagina)
        indiceAtual = indiceAtual + tamanhoPagina
        dgPaginacao.DataSource = ds.Tables(0)
    End Sub

A seguir o código dos botões que permitem a navegação para frente a para trás efetuando  a paginação de dados

Private Sub btnProximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProximo.Click

ds = obtemDadosPagina(da, indiceAtual, tamanhoPagina)

indiceAtual = indiceAtual + tamanhoPagina

dgPaginacao.DataSource = ds.Tables(0)

End Sub

Botão Próximo

Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click

ds = obtemDadosPagina(da, indiceAtual, tamanhoPagina)

indiceAtual = indiceAtual - tamanhoPagina

dgPaginacao.DataSource = ds.Tables(0)

End Sub

Botão Anterior

Creio que agora somente resta executar o projeto e obter a paginação. Abaixo uma tela exibindo a sequência da página para 9 registros por página:

Eu sei , é apenas VB.NET , mas eu gosto ....

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti