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