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!

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 SubSubito 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 subConclusioni
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
- Galleria fotografica dinamica con ASP.NET AJAX
- Usare Search come un servizio nei tuoi siti e nei tuoi client
- Mappe nel tuo sito con Virtual Earth
- Integrare Windows Live ID, Contacts e Presence API nelle tue applicazioni
- Introduzione ai cloud based service con Windows Live Services
- Realizzare un custom extender AJAX con ASP.NET 3.5
- Tracciare le modifiche ai dati e allineare i datawarehouse con il Change Data Capture in SQL Server 2008
- Le nuove caratteristiche di IIS 7.0 per sviluppatori e sistemisti
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà

Stampa
Download


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
