C# - Paginando e Imprimindo o DataGridView (via DataSet)


 Neste artigo vou mostrar como podemos realizar a paginação em um controle DataGridView usando um Dataset e a linguagem C#.

O controle DataGridView é muito versátil e perfeito para exibir dados no formato tabular. Ocorre que quando a quantidade de dados for muito grande não é muito aconselhável exibir todos os registros de uma vez no controle pois isso pode impactar de forma negativa o desempenho da sua aplicação.

Uma solução é realizar a paginação de dados carregando apenas uma parte dos dados por vez conforme eles forem solicitados.

Uma maneira de fazer isso é através da criação de um DataSet via método Fill do objeto DataAdapter que 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 :

Como exemplo vou acessar a tabela Products do banco de de dados Northwind.mdf do SQL Server para obter os dados e realizar a paginação. (Também vou implementar a impressão do DataGridView)

Recursos usados :

Criando o projeto no VS 2015

Abra o VS Community 2015  e clique em New Project;

A seguir selecione Visual C# -> Windows -> Windows Forms Application;

Informe o nome DataGridView_Paginacao e clique no botão OK;

A partir da ToolBox inclua os seguintes controles no formulário form1.vb:

Abaixo leiaute do formulário:
 

 

Vamos definir os namespaces usados no projeto:

using System;
using
System.Data;
using
System.Data.SqlClient;
using
System.Drawing;
using
System.Windows.Forms;

A seguir vamos definir as variáveis que serão usadas em todo o formulário:

SqlDataAdapter daPaginacao;
DataSet dsPaginado;
DataTable dt;
int regInicio;
int registros;
int quantidadeRegistrosPaginar;

Agora em cada evento Click de cada um dos botões de comando vamos definir o respectivo código:

 

1 - Carregar Dados no DataGridView

 

No evento Click do botão de comando - Carregar dados do SQL Server - inclua o código abaixo:

 

          private void btnCarregarDados_Click(object sender, EventArgs e)
        {
            try
            {
                quantidadeRegistrosPaginar = Convert.ToInt32(txtQuantidadeRegistros.Text);
                string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True";
                string sql = "SELECT * FROM Products";
                SqlConnection connection = new SqlConnection(connectionString);
                daPaginacao = new SqlDataAdapter(sql, connection);
                dsPaginado = new DataSet();
                dt = new DataTable();
                connection.Open();
                daPaginacao.Fill(dt);
                registros = dt.Rows.Count;
                daPaginacao.Fill(dsPaginado, regInicio, quantidadeRegistrosPaginar, "Products");
                connection.Close();
                dgvDados.DataSource = dsPaginado;
                dgvDados.DataMember = "Products";
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

 

Neste código temos o seguinte :

 

- obtemos a quantidade de registros a paginar do controle TextBox - txtQuantidadeRegistros,

- definimos a string de conexão para acessar o banco de dados Northwind do SQL Server

- Definimos a string SQL para acessar e retornar todos os registros da tabela Products :

- Criamos a conexão

- Criamos o objeto DataAdapter

- Criamos os objetos DataSet e DataTable

- Preenchemos o DataTable e retornamos a quantidade total de registro da tabela

- Criamos o dataset paginado

- fechamos a conexão

- e atribuímos o dataset ao controle DatagridView na sua propriedade DataSource

 

2 - Paginar para frente

 

No evento Click do botão de comando btnProximo temos o seguinte código :

 

       private void btnProximo_Click(object sender, EventArgs e)
        {
            regInicio = regInicio + quantidadeRegistrosPaginar;
            if (regInicio >= registros)
            {
                regInicio = registros - quantidadeRegistrosPaginar;
            }
            dsPaginado.Clear();
            //da.Fill(dataset, no. registro de inicio, qtde de registros a retornar, nome da tabela)
            daPaginacao.Fill(dsPaginado, regInicio, quantidadeRegistrosPaginar, "Products");
        }

 

3 - Paginar para trás (ou de volta)

 

No evento Click do botão de comando btnAnterior temos o seguinte código :

 

     private void btnAnterior_Click(object sender, EventArgs e)
     {
            regInicio = regInicio - quantidadeRegistrosPaginar;
            if (regInicio <= 0)
            {
                regInicio = 0;
            }
            dsPaginado.Clear();
         //da.Fill(dataset, no. registro de inicio, qtde de registros a retornar, nome da tabela)
            daPaginacao.Fill(dsPaginado, regInicio, quantidadeRegistrosPaginar, "Products");
     }

 

4 - Imprimir o DataGridVIew

 

No evento Click do botão de comando btnImprimir inclua o código abaixo:

 

     private void btnImprimir_Click(object sender, EventArgs e)
    {
            printDocument.Print();
    }

 

A seguir defina o seguinte código no evento PrintPage do objeto printDocument:

 

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
            Bitmap bm = new Bitmap(this.dgvDados.Width, this.dgvDados.Height);
            dgvDados.DrawToBitmap(bm, new Rectangle(0, 0, this.dgvDados.Width, this.dgvDados.Height));
            e.Graphics.DrawImage(bm, 0, 0);
    }

 

 

Serão impressos somente os dados atuais que estão sendo exibidos pelo DataGridView no formulário.

 

Ao executar o projeto basta definir a quantidade de registros a paginar, carregar os dados e realizar a paginação:

 

Pegue o projeto completo aqui :   DataGridView_Paginacao.zip

E esta é a mensagem que dele (Jesus) ouvimos, e vos anunciamos: que Deus é luz, e não há nele trevas nenhumas.
Se dissermos que temos comunhão com ele, e andarmos em trevas, mentimos, e não praticamos a verdade.

1 João 1:5,6

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 ?

Referências:


José Carlos Macoratti