Paginare un datagridview tramite VB.Net e C#

In questo articolo vedremo come effettuare la paginazione di un controllo datagridview in ambiente Windows Application. I linguaggi utilizzati saranno VB.Net e C# (framework 3.5).

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Figura 1
In questo articolo, vedremo come effettuare la paginazione di un datagridview,  tramite i pulsanti ci si può spostare al record precedente, successivo, primo ed ultimo.
In una form, inseriamo un controllo datagridview, tre label, due caselle di testo e cinque pulsanti, la form deve avere un aspetto simile alla figura 1.
La casella di testo, relativa al record per la pagina, avrà il compito di visualizzare il numero dei record nel datagridview, mentre la casella di testo denominata posizione, indicherà la posizione in cui ci si trova.
Il database utilizzato è Microsoft Access, ma questa tecnica si può utilizzare con qualsiasi database, il database utilizzato è quello di Esempio di Microsoft, ossia Northwind.mdb.
Stesura del codice
Dopo aver completato la parte grafica della form, non ci resta che scrivere il relativo codice.
Si creano delle nseriamo delle variabili a livello di classe, le quali ci permettono di avere le informazioni relativi al record attuale, al totale dei record, alla pagina corrente ed un datatable, con i relativi cati.
Di seguito si riporta il codice di tale operazione:

VB.Net
Public Class Form1
    'Variabili locali per la gestione della paginazione
    Private PaginaCorrente As Integer
    Private dttDati As DataTable
    Private TotalePagine As Integer
    Private RecordAttuale As Integer
C#

//Variabili locali per la gestione della paginazione
        private Int32 PaginaCorrente;
        private DataTable dttDati;
        private Int32 TotalePagine;
        private Int32 RecordAttuale;

Fatto ciò, si crea una funzione, che permetta il caricamento dei dati nel controllo DatagridView.
Di seguito si riporta tale funzione.
La funzione CaricaDati, verrà richiamata non solo dal pulsante Carica, ma anche dagli altri pulsanti di spostamento.
Qui di seguito si riporta il frammento del codice relativo al pulsante carica.

VB.NEt
  ''' <summary>
    ''' Funzione per il carimento dei dati
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub CaricaDati()


        Dim conta As Integer
        Dim RecordInziale As Integer
        Dim RecordFinale As Integer
        'DataTable temporaneo
        Dim dttTemp As DataTable

        'Record per pagina
        Dim RecordPerPagina As Integer
        'Totale record
        Dim TotaleRecord As Integer

        RecordPerPagina = CType(TxtRecordPerPagina.Text, Integer)
        'rilevo il totale dei record
        TotaleRecord = dttDati.Rows.Count
        'Copio i dati in un dataTable temporaneo
        dttTemp = dttDati.Clone
        'rilevo il record finale
        If PaginaCorrente = TotalePagine Then
            RecordFinale = TotaleRecord
        Else
            RecordFinale = RecordPerPagina * PaginaCorrente
        End If
        'rilevo il recordo iniziale
        RecordInziale = RecordAttuale

        'importo (copio) i record che dovrò visualizzare dal range composto dal record iniziale al record finale
        For conta = RecordInziale To RecordFinale - 1
            dttTemp.ImportRow(dttDati.Rows(conta))
            RecordAttuale = RecordAttuale + 1
        Next
        'carico la griglia e visualizzare la posizione
        DtgDati.DataSource = dttTemp
        txtPosizione.Text = "Pagina " & PaginaCorrente.ToString() & "/" & TotalePagine.ToString()
    End Sub


C#
 /// <summary>
        /// Funzione per il carimento dei dati
        /// </summary>
        private void CaricaDati()
        {
            Int32 RecordInziale;
            Int32 RecordFinale;
            //DataTable temporaneo
            DataTable dttTemp;

            //Record per pagina
            Int32 RecordPerPagina;
            //Totale record
            Int32 TotaleRecord;

            RecordPerPagina = Convert.ToInt32(TxtRecordPerPagina.Text);
            //rilevo il totale dei record
            TotaleRecord = dttDati.Rows.Count;
            //Copio i dati in un dataTable temporaneo
            dttTemp = dttDati.Clone();
            //rilevo il record finale
            if (PaginaCorrente == TotalePagine)
                RecordFinale = TotaleRecord;
            else
                RecordFinale = RecordPerPagina * PaginaCorrente;

            //rilevo il recordo iniziale
            RecordInziale = RecordAttuale;

            //importo (copio) i record che dovrò visualizzare dal range composto dal record iniziale al record finale
            for (int conta = RecordInziale; conta < RecordFinale; conta++)
            {
                dttTemp.ImportRow(dttDati.Rows[conta]);
                RecordAttuale = RecordAttuale + 1;

            }

            //carico la griglia e visualizzare la posizione
            DtgDati.DataSource = dttTemp;
            txtPosizione.Text = "Pagina " + PaginaCorrente.ToString() + "/" + TotalePagine.ToString();

        }

 Il pulsante carica, avrà il compito di caricare per la prima volta il datagridview e valorizzare le variabili.

VB.Net
 Private Sub BtnCarica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCarica.Click
        'connessione
        Dim conDati As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\Northwind.mdb")
 
        'oggetto per la query
        Dim daDati As New OleDbDataAdapter("select * from customers", conDati)
        Dim dtsDati As New DataSet()

        'Carico il dataset
        daDati.Fill(dtsDati, "customers")

        'Gestione delle pagine
        dttDati = dtsDati.Tables("customers")
        TotalePagine = dttDati.Rows.Count / CType(TxtRecordPerPagina.Text, Integer)
        If (dttDati.Rows.Count Mod CType(TxtRecordPerPagina.Text, Integer)) > 0 Then
            TotalePagine = TotalePagine + 1
        End If
        'Imposto le variabile per la paginazione
        PaginaCorrente = 1
        RecordAttuale = 0
        'Carico i dati
        CaricaDati()
 

    End Sub

C#
 private void BtnCarica_Click(object sender, EventArgs e)
        {
            //connessione
            OleDbConnection conDati = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\\Northwind.mdb");

            //oggetto per la query
            OleDbDataAdapter daDati = new OleDbDataAdapter("select * from customers", conDati);
            DataSet dtsDati = new DataSet();


            //Carico il dataset
            daDati.Fill(dtsDati, "customers");

            //Gestione delle agpine
            dttDati = dtsDati.Tables["customers"];
            TotalePagine = dttDati.Rows.Count / Convert.ToInt32(TxtRecordPerPagina.Text);

            if (dttDati.Rows.Count % Convert.ToInt32(TxtRecordPerPagina.Text) > 0)
                TotalePagine = TotalePagine + 1;

            //Imposto le variabile per la paginazione
            PaginaCorrente = 1;
            RecordAttuale = 0;
            //Carico i dati
            CaricaDati();
        }

Ora non ci resta che impostare il codice dei vari pulsanti.
Di seguito si riporta il codice per quanto concerne il pulsante che ci riporta ai primi record, il pulsante primo, avrà il compito di portarci alla prima pagina della nostra paginazione.

Terminata questa operazione, vediamo il codice per il pulsante ultimo, ossia per la fine dei record.

VB.Net
  Private Sub btnPrimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimo.Click
        PaginaCorrente = 1
        RecordAttuale = 0
        CaricaDati()
    End Sub

C#
 private void btnPrimo_Click(object sender, EventArgs e)
        {
            PaginaCorrente = 1;
            RecordAttuale = 0;
            CaricaDati();
        }

 Terminata questa operazione, vediamo il codice per il pulsante ultimo, ossia per la visualizzazione degli ultimi record, della nostra paginazione.

VB.Net
 Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click
        PaginaCorrente = TotalePagine
        RecordAttuale = dttDati.Rows.Count - 1
        CaricaDati()

    End Sub
C#
private void btnUltimo_Click(object sender, EventArgs e)
        {
            PaginaCorrente = TotalePagine;
            RecordAttuale = dttDati.Rows.Count - 1;
            CaricaDati();
        }

Ora non ci resta che valorizzare i pulsanti precedente e successivo, questi pulsanti hanno il compito di spostarci alla "pagina" precedente o successiva.
Di seguito si riporta il codice per il pulsante precedente.

VB.Net
 Private Sub btnPrecedente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrecedente.Click
        PaginaCorrente -= 1
        If PaginaCorrente < 1 Then
            PaginaCorrente = 1
            Return
        End If
        RecordAttuale = CType(TxtRecordPerPagina.Text, Integer) * (PaginaCorrente - 1)
        CaricaDati()
    End Sub

C#
 private void btnPrecedente_Click(object sender, EventArgs e)
        {
            PaginaCorrente -= 1;
            if (PaginaCorrente < 1)
            {
                PaginaCorrente = 1;
                return;
            }

            RecordAttuale = Convert.ToInt32(TxtRecordPerPagina.Text) * (PaginaCorrente - 1);
            CaricaDati();
        }

 Mentre qui di seguito viene riportato il frammento di codice per il pulsante successivo:

VB.Net
  Private Sub BtnSuccessivo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSuccessivo.Click
        If TotalePagine = 0 Then
            MessageBox.Show("Impostare la dimensione della pagina e verificare i dati")
            Return
        End If
        PaginaCorrente += 1
        If PaginaCorrente > TotalePagine Then
            PaginaCorrente = TotalePagine
            If RecordAttuale = dttDati.Rows.Count Then
                Return
            End If
        End If
        CaricaDati()

    End Sub

C#
 private void BtnSuccessivo_Click(object sender, EventArgs e)
        {
            if (TotalePagine == 0)
            {
                MessageBox.Show("Impostare la dimensione della pagina e verificare i dati");
                return;
            }

            PaginaCorrente += 1;
            if (PaginaCorrente > TotalePagine)
            {
                PaginaCorrente = TotalePagine;
                if (RecordAttuale == dttDati.Rows.Count)
                    return;
            }
            CaricaDati();
        }

 Conclusioni:
Ora non ci resta che testare l'applicazioni, dopo aver verificato la correttezza del codice ed aver posizionato il database access di esempio, in C:\ (modificare la  stringa relativa alla proprietà connectionstring per impstare un altro percorso) avviate il programma.

Vedremo la griglia vuota, tramite il pulsante carica (ricrordarsi di impostare la casella di testo con il numero degli elementi da visualizzare)  vedremo la griglia valorizzata e tramite i pulsanti, ci spostiamo tra i vari record.
Tramite la parola download è possibile scaricare il file di esempio:

Download