C# -  Paginando dados no DataGridView - I

  Neste artigo vou mostrar como preencher um controle DataGridView com dados do SQL Server e como realizar a paginação neste componente usando a linguagem C# em um projeto Windows Forms.

Eu já perdi a conta do número de artigos que escrevi sobre o controle DataGridView. A maior parte deles foi usando a linguagem VB .NET e hoje vou tratar do assunto usando a linguagem C#.

O controle DataGridView controle e suas classes relacionadas permite exibir e editar dados no formato tabular de uma forma simples e rápida.

No DataGridView a célula é a unidade fundamental de interação sendo que todas as células derivam da classe base DataGridViewCell.  Cada célula no DataGridView pode ter o seu próprio estilo, como formato de texto, cor de fundo, cor de primeiro plano e fonte. Se o DataGridView tiver muitas linhas podemos implementar funcionalidades de paginação.  Para implementar a paginação devemos saber os limites das páginas.

Neste artigo eu mostro uma das maneiras de realizar a paginação no DataGridView que irá acessar e exibir dados de um banco de dados SQL Server.

Vou implementar uma pequena camada de acesso a dados usando uma classe para isso devido a simplicidade do projeto. Dessa forma vou evitar de colocar o código de acesso a dados no formulário o que é uma boa prática.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community e clique em New Project;

Selecione a linguagem C# e o template Windows Forms Application;

Informe o nome da solução como DatagridView_Paginacao e clique no botão OK;

Vamos acessar a tabela Customers do banco de dados Northwind.mdf e vamos definir a string de conexão no arquivo App.Config:

...
<connectionStrings>
  <add name="conexaoNorthwind" connectionString="Data Source=.\sqlexpress;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
...

Temos que incluir uma referência em nosso projeto ao namespace System.Configuration.

No menu Project clique em Add Reference, clique na opção Assemblies e marque o namespace System.Configuration.

A seguir inclua os seguintes controles no formulário form1.cs :

Disponha os controles conforme o leiaute da figura abaixo:

Defina os seguintes namespaces no formulário form1.cs:

using System;

using System.Configuration;

using System.Data;

using System.Data.SqlClient;

using System.Windows.Forms;

Após a declaração do formulário vamos definir as variáveis a seguir que iremos usar no projeto:

SqlDataAdapter pagingAdapter;

DataSet paginaDS;

int Deslocamento;

int tamanhoPagina = 10;

int TotalRegistros;

gora vamos implementar o código no formulário usando os eventos Click dos botões

Evento Click do botão Carregar Dados:

 private void btnCarregar_Click(object sender, EventArgs e)
  {
            try
            {
                string conString = ConfigurationManager.ConnectionStrings["conexaoNorthwind"].ConnectionString;
                string sql = "SELECT CustomerId, CompanyName, ContactName, City, Country FROM Customers";
                TotalRegistros = AcessoBD.SelectScalar("Select Count(*) from Customers");
                SqlConnection connection = new SqlConnection(conString);
                pagingAdapter = new SqlDataAdapter(sql, connection);
                paginaDS = new DataSet();
                connection.Open();
                pagingAdapter.Fill(paginaDS, Deslocamento, tamanhoPagina, "Customers");
                connection.Close();
                dgvDados.DataSource = paginaDS;
                dgvDados.DataMember = "Customers";
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro :" + ex.Message);
            }
  }
           
Private Sub btnCarregar_Click(sender As Object, e As EventArgs)
	Try
		Dim conString As String = ConfigurationManager.ConnectionStrings("conexaoNorthwind").ConnectionString
		Dim sql As String = "SELECT CustomerId, CompanyName, ContactName, City, Country FROM Customers"
		TotalRegistros = AcessoBD.SelectScalar("Select Count(*) from Customers")
		Dim connection As New SqlConnection(conString)
		pagingAdapter = New SqlDataAdapter(sql, connection)
		paginaDS = New DataSet()
		connection.Open()
		pagingAdapter.Fill(paginaDS, Deslocamento, tamanhoPagina, "Customers")
		connection.Close()
		dgvDados.DataSource = paginaDS
		dgvDados.DataMember = "Customers"
	Catch ex As Exception
		MessageBox.Show("Erro :" + ex.Message)
	End Try
End Sub

 

C# VB .NET

Observe que eu estou obtendo o total de registros da tabela usando o método AcessoBD.SelectScalar() esse método estático foi definido em na classe AcessoBD() que tem o seguinte código:

       public static int SelectScalar(string sql)
        {
            using (SqlConnection connection = GetDbConnection())
            {
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    return Convert.ToInt32(command.ExecuteScalar());
                }
            }
        }
Public Shared Function SelectScalar(ByVal sql As String) As String
        Using connection As SqlConnection = GetDbConnection()
            Using command As New SqlCommand(sql, connection)
                Return CStr(command.ExecuteScalar)
            End Using
        End Using
    End Function
 
C# VB .NET

Para paginar vamos usar os botões de comando:

1- Próximo

  private void btnProximo_Click(object sender, EventArgs e)
        {
            Deslocamento = Deslocamento + tamanhoPagina;
            if (Deslocamento > TotalRegistros)
            {
                Deslocamento = Deslocamento- TotalRegistros;
            }
            paginaDS.Clear();
            pagingAdapter.Fill(paginaDS, Deslocamento, tamanhoPagina, "Customers");
        }

 

Private Sub btnProximo_Click(sender As Object, e As EventArgs)
	Deslocamento = Deslocamento + tamanhoPagina
	If Deslocamento > TotalRegistros Then
		Deslocamento = Deslocamento - TotalRegistros
	End If
	paginaDS.Clear()
	pagingAdapter.Fill(paginaDS, Deslocamento, tamanhoPagina, "Customers")
End Sub

 

2- Anterior

 private void btnAnterior_Click(object sender, EventArgs e)
        {
            Deslocamento = Deslocamento - tamanhoPagina;
            if (Deslocamento <= 0)
            {
                Deslocamento = 0;
            }
            paginaDS.Clear();
            pagingAdapter.Fill(paginaDS, Deslocamento, tamanhoPagina, "Customers");
        }

 

Private Sub btnAnterior_Click(sender As Object, e As EventArgs)
	Deslocamento = Deslocamento - tamanhoPagina
	If Deslocamento <= 0 Then
		Deslocamento = 0
	End If
	paginaDS.Clear()
	pagingAdapter.Fill(paginaDS, Deslocamento, tamanhoPagina, "Customers")
End Sub

 

Executando o projeto iremos obter: 

Este exemplo mistura código de acesso a dados na camada de apresentação e isso não é uma boa prática. O mais correto seria criar uma classe para fazer o acesso a dados e separar as responsabilidades.

Na segunda parte vou mostrar outra maneira de realizar a paginação no DataGridView.

Pegue o projeto completo aqui :  DatagridView_Paginacao.zip

E Jesus, tendo ouvido isto, disse-lhes: Os sãos não necessitam de médico, mas, sim, os que estão doentes; eu não vim chamar os justos, mas, sim, os pecadores ao arrependimento.
Marcos 2:17

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti