domenica 20 luglio 2008

La paginazione del controllo DatagridView(VB.Net e C#)

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

Nessun commento: