Paginare un datagrid con ASP.NET e ADO.NET

2 pagine in totale: <<Indietro 1 [2]

I contro di questo metodo

Nel database presente nell'allegato sono presenti due tabelle. La prima, quella utilizzata dal nostro primo script contiene 150 record, la seconda 7200 (i cui contenuti sono stati creati in maniera casuale). La pagina "database2.aspx" è perfettamente identica come codice a quella vista poco fa, l'unica differenza sta nell'utilizzo della seconda più corposa tabella.
Come è facilmente visibile, l'unica differenza sta nel numero di record presenti a fondo pagina e il numero di pagine (nel primo esempio erano 10, in questo 480). Nessun'altra differenza è visibile, ma se proviamo nel secondo script a saltare da una pagina alla successiva si potrà notare un certo ritardo nella risposta.
Questo è dovuto dal fatto che questo metodo di paginazione carica in memoria tutto il contenuto della tabella e da questa preleva i dati interessati con uno spreco di risorse hardware (processore e memoria) e di banda della LAN, nel caso in cui si utilizzi un server database come SQL Server su un server diverso da quello web.
Questo metodo è CONSIGLIATO solo in caso di poche centinaia di record se non si vuole inchiodare il server: provate ad immaginare l'uso di memoria e di carico con decine di utenti contemporanei e 40.000 record!

Immagine

La soluzione

Si provi ora a visualizzare "database3.aspx" e a passare da una pagina all'altra. La risposta confrontata con lo script precedente è nettamente più veloce, pressoché al pari del primo script che di record ne visualizzava solo 150. Com'è stato possibile questo? Abbiamo elaborato direttamente il contenuto della tabella grazie alla proprietà "AllowCustomPaging" ora impostata a "True" e all'utilizzo di un'altra proprietà del datagrid: "VirtualItemCount". In esso dovremo inserire il numero di record restituiti dalla query.
In questo modo non sarà più il datagrid ha elaborare la tabella, a contare il numero di record e a scegliere quelli che devono essere visualizzati, ma si occuperà di mostrare solo il layout della tabella, con i link per il salto pagina e nulla più.
In parole povere, il datagrid guarda il contenuto del "VirtualItemCount" e dividendo per il numero di record per pagina ottiene il numero di pagine da visualizzare.
Quindi, le modifiche del nostro codice non sono molte: la Sub per il riempimento della tabella è diventata la seguente:

Sub binddata()
    Dim DS As DataSet
    Dim MyConnection as OleDbConnection
    Dim MyCommand As OleDbDataAdapter
    Dim quanti as integer
    MyConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source="+server.mappath("database.mdb"))

    myConnection.Open()
    if MyDataGrid.VirtualItemCount =0 then
        Dim myCommand2 As New OleDbCommand("select count(*) from tabella2", myConnection)
        quanti = mycommand2.executeScalar()
        MyDataGrid.VirtualItemCount = quanti
    else
        quanti = MyDataGrid.VirtualItemCount
    end if

    MyCommand = New OleDbDataAdapter("select * from tabella2", MyConnection)
    DS = new DataSet()
    MyCommand.Fill(ds,(start_index*15),15, "tabella2")
    dim source as dataview=ds.Tables("tabella2").DefaultView
    MyDataGrid.DataSource=source
    MyDataGrid.DataBind()
    MyConnection.close()
    lblMessage.Text = "Pagina " & MyDataGrid.CurrentPageIndex+1 & _
        " di " & MyDataGrid.PageCount & _
        ". Record presenti=" & quanti
End Sub

Subito dopo l'apertura del database viene effettuato il controllo della proprietà "VirtualItemCount". Se essa è impostata a zero, viene eseguita la query per il conteggio dei record nella tabella e quindi impostata la proprietà "VirtualItemCount" nel valore esatto. E' possibile impostare anche manualmente, già nel datagrid il valore esatto per non dover effettuare query di conteggio solo se si conosce a priori il numero di record presenti nel database.
Il punto più importante di tutto lo script è questa linea di codice:

MyCommand.Fill(ds,(start_index*15),15, "tabella2")

Con la funzione "Fill" possiamo "riempire" un dataset con il contenuto di un database. Normalmente tale funzione è conosciuta con la sintassi base:

MyCommand.Fill(dataset, nome_tabella)

Tuttavia questa funzione accetta anche altri parametri (consiglio la visita al sito MSDN della Microsoft per ulteriori informazioni):

MyCommand.Fill(dataset, inizio, quanti, nome_tabella)

Dove "inizio" e "quanti" sono valori numerici che impongono alla funzione di riempire il dataset in base ai valori specificati.

MyCommand.fill(dataset,100,50,"tabella2")

La riga precedente inserirà nel dataset solo i record dal numero 100 al 150 della query effettuata: ecco il semplice trucco per risparmiare risorse!

Ritornando al nostro esempio, "start_index" è il numero di pagina attuale. Tale valore viene assegnato nella funzione richiamata dal datagrid per il cambio pagina:

sub saltapagina(sender as Object , e as DataGridPageChangedEventArgs)
    MyDataGrid.CurrentPageIndex=e.NewPageIndex
    start_index=e.NewPageIndex
    binddata()
end sub

Conclusioni

In queso articolo ho cercato di affrontare l'argomento nel modo più semplice possibile.
Come abbiamo visto, con poche centinaia di record possiamo utilizzare il primo metodo, ma se la tabella risulta più corposa è ovviamente consigliato il secondo.
Gli script qui presentati devono ritenersi una base per qualcosa di più avanzato. Come si è visto la paginazione in automatico del datagrid inserisce solo i link per saltare alla pagina precedente o alla successiva, ma non alla prima o ad un determinato numero di pagina. Grazie alla proprietà "PageCount" del datagrid, è possibile sapere a priori il numero di pagina, e costruire di conseguenza dei pulsanti che saltano direttamente alla prima pagina, all'ultima o ad una scelta dall'utente. Modificando direttamente la proprietà del datagrid "CurrentPageIndex" possiamo decidere in una sola riga quale pagina visualizzare (si veda la funzione di poco fa, "SaltaPagina"). Oppure, si provi a modificare il "mode" da " NextPrev" a "NumericPages" nel PagerStyle del datagrid.
Per ulteriori informazioni e approfondimenti sull'argomento, consiglio la visita diretta al sito MSDN della Microsoft.

2 pagine in totale: <<Indietro 1 [2]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC