Il blog di Emanuele Mattei in ambito Database

Programmazione database, ado.net e database mobile

Blog

Siti

Siti Sql Server

Siti vari

Tools

agosto 2008 - Posts

La paginazione del controllo DatagridView

Per il sito http://www.iprogrammatori.it/articoli/programmazione/pagina-datagridview-con-vbnet.asp ho scritto un articolo riguardante la possibilità di rendere il controllo Datagridview con la paginazione, in ambiente Windows Application.


 

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 e quindi utilizzeremo le classi del namespace system.data.oledb.
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

'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

 

Posted: ago 24 2008, 05.24 by EmanueleM | with no comments
Filed under: