Home Page Home Page Articoli Come paginare un DataList

Come paginare un DataList

In questo articolo viene spiegato come paginare un DataList, grazie all'aiuto di stored procedure e al supporto per il paging offerto dal controllo stesso. Per ottenere una paginazione veloce, leggera, e personalizzabile al massimo.
Autore: Loris Badii Livello:
Spero di fare cosa gradita nel pubblicare questa soluzione asp.net, ci sono molti tutorial in rete su come paginare un datagrid ma molto pochi su come farlo con un datalist o repeater. E quei pochi che ci sono non sono di facile impatto con stored procedure complicate etc., e ancora, non prevedono una di quelle situazioni classiche che spesso ci si trova ad affrontare prelevando una categoria da un menù.
Lo scopo quindi è quello di poter utilizzare per paginare un Datalist con tutte le sue caratteristiche anche quindi di notevole risparmio di risorse rispetto ad un DataGrid.
Altra cosa è che questa soluzione è molto veloce e completamente riutilizzabile.
Qui la vedrete esposta e scritta con MSSQL , VS e file behind, ma nulla vieta di utilizzare un altro tipo di scrittura e un altro database, comunque per non dilungarmi troppo non starò a spiegare le alternative, fate riferimento alla documentazione.
Andiamo allora a creare il nostro nuovo progetto asp.net, avremo bisogno di 2 pagine:
?Default.aspx? e
?Prodotti.aspx?
Per prima cosa creeremo il nostro database, creiamo una tabella ?Prodotti? e una ?Categorie?
e dotiamo di una chiave esterna comune ?Prodotti?

Struttura della tabella categorie
Struttura della tabella categorie


Struttura della tabella prodotti
Struttura della tabella prodotti


Apriamo il query analizer o il suo equivalente e creiamo 2 semplicissime stored procedure, 1 per estrarre le categorie e una per i prodotti:

Categorie:
CREATE Procedure ProductCategoryList
AS
SELECT Idcat, Nomecat FROM Categorie ORDER BY Nomecat ASC

Prodotti:
Create Procedure getProdByCat
( @IDcat int )
As
SELECT PID, descrizione, UnitCost, Img FROM Prodotti WHERE IDcat = @IDcat

Tutto qui.
Ora chiudiamo l?interfaccia e non pensiamo più al database.

Questo approccio, è stato pensato per avere un file di classe che controlla i dati, dal e per il database, per tutto il sito.

Creiamo un file di classe? prodDb.vb ?
All?interno del nostro nuovo namespace andiamo a creare una classe omonima e inseriamo 2 funzioni, una per estrarre le categorie e una per i prodotti:
La prima restituisce un Datareader, la seconda un datatable:


?// creo la funzione che va ad estrarre l?id della categoria e restituisce il datareader
Public Function GetProdCat() As SqlDataReader
Dim myConnection As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
Dim myCommand As SqlCommand = New SqlCommand("ProductCategoryList", myConnection)
myCommand.CommandType = CommandType.StoredProcedure
myConnection.Open()
Dim result As SqlDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
Return result
End Function


questa funzione estrae i prodotti, crea un datatable da un datastet persistente, abbiamo utilizzato un dataset per poter implementare un adattatore altrimenti non si sarebbe potuta fare la paginazione, e mi faccio restituire un DataTable con il metodo ?copy?, in modo che ogni nuova istanza abbia la stessa struttura (schemi, relazioni e vincoli della tabella) e gli stessi dati dell'oggetto DataTable corrente.


?// ora creo la funzione che estrae i prodotti e la assegno ad un DataTable che mi restituisce il dataset
Public Function GetProducts(ByVal IDCat As Integer) As DataTable
Dim results As DataSet = New DataSet()
?//faccio la connessione ma utilizzo una adattatore e chiamo il metodo ?fill?
MyAdapter.Fill(results, "getProdByCat")
?// chiedo mi venga restituito il datatable
Return results.Tables("getProdByCat").Copy
End Function


Il menù lo possiamo mettere in un controllo utente:
il grosso del lavoro lo abbiamo già fatto dobbiamo solo?attaccare? il menù alla funzione nella classe che abbiamo appena scritto, nell?evento ?page_load? io ho aggiunto una variabile che collego ad una proprietà di selezione, ma è solo per la grafica voi potete decidere in altro senso, quello che vi servirà quindi e solo collegare questo datalist.


?//dichiariamo e inizializziamo l?istanza
Dim products As HpSite.ProdDB = New HpSite.ProdDB()
?//impostiamo la sorgente dati e colleghiamola
MyList.DataSource = products.GetProdCat()
MyList.DataBind()


Visualizziamo poi li nostro menù tramite un datalist con dentro un controllo Hyperlink

Ora creiamo il file per la paginazione, per paginare utilizziamo pagedDatasource e CurrentPageIndex per specificare o determinare l'indice della pagina corrente.
PagedDataSource fa parte dello spazio dei nomi: System.Web.UI.UserControl per questo lo dobbiamo importare all?inizio prima di creare la classe.


?// istanziamo la classe pagedDataSource
Public pagedData As New PagedDataSource()
?// diciamogli subito di eseguire la sub ?dopaging()?
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
dopaging()
End Sub


Ora creiamo la subroutine dopaging che ci permetterà di scorrere le pagine e raccogliamo i parametri


Sub dopaging()
Dim selectionid As String = (Request.Params("selection"))
Dim IDcat As Integer = CStr(Request.Params("IDcat"))
?//collegamento e percorso alla classe
Dim ProductCatalogue As HpSite.ProdDB = New HpSite.ProdDB()
?//assegniamo alla classe pageddatasource la sorgente dati con relativo percorso
pagedData.DataSource = ProductCatalogue.GetProducts(IDcat).DefaultView
?//attiviamo il paging e impostiamo il numero di record da mostrare per ogni ?//pagina
pagedData.AllowPaging = True
pagedData.PageSize = X
?//raccogliamo le eccezioni
Try
pagedData.CurrentPageIndex = Int32.Parse(Request.QueryString("Page")).ToString()
Catch ex As Exception
pagedData.CurrentPageIndex = 0
End Try
?//rendiamo visibili o invisibili I bottoni ?avanti? ?indietro? a seconda della ?//situazione
btnPrev.Visible = (Not pagedData.IsFirstPage)
btnNext.Visible = (Not pagedData.IsLastPage)
?//contiamo I record e le pagine
pageNumber.Text = (pagedData.CurrentPageIndex + 1) & " of " & pagedData.PageCount
?//colleghiamo la sorgente dati al datalist
MyList.DataSource = pagedData
MyList.DataBind()
End Sub


Creiamo 2 bottoni uno per avanti e uno per indietro, per fare questo utilizziamo la proprietà: Proprietà HttpRequest.CurrentExecutionFilePath che restituisce il percorso di file corretto della pagina attualmente in esecuzione in scenari di reindirizzamento .


Private Sub Prev_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrev.Click
Response.Redirect(Request.CurrentExecutionFilePath & "?&Page=" &_
?//passiamo I parametri
(pagedData.CurrentPageIndex - 1) & "&Idcat=" & Request.Params("IDcat") &_ "&selection=" & Request.Params("selection"))
End Sub


Ora vediamo il risultato:

La pagina per la selezione della categoria
La pagina per la selezione della categoria


Il datalist paginato per visualizzare i prodotti
Il datalist paginato per visualizzare i prodotti


Il codice completo con tutti i files lo potete scaricare dal file zip allegato all?articolo, e testare tranquillamente sul vostro pc in locale.
Buon divertimento!
Voto medio articolo: 3.4 Numero Voti: 7

File allegati


Loris Badii

Loris Badii

Profilo completo

Articoli collegati

Utilizzare controlli lato server in un Datagrid
Il DataGrid è un controllo molto avanzato spesso usato in ASP.NET. La maggior parte degli sviluppatori utilizza le funzioni basilari. E' possibile però estenderlo utilizzando controlli server aggiuntivi all'interno delle celle. Vediamo un esempio con una Combo Box.
Autore: Luca Graziani | Difficoltà: | Commenti: 6 | Voto:
Utilizzare il Tracing in ASP.NET
Scopriamo in questo articolo il servizio di analisi di ASP.NET che permette di controllare e analizzare le richieste web, consentendo di scrivere nel log del servizio di analisi in modo da effettuare a runtime una sorta di debug dell'applicazione Web.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Spedire messaggi SMS con .NET
Spiegheremo in questo articolo alcune tecniche per inviare messaggi SMS tramite .NET: invio tramite Web Service, invio diretto tramite cellulare oppure invio tramite un SMS Gateway. Presente anche un esempio pratico di invio con ASP.NET e Web Service.
Autore: David De Giacomi | Difficoltà: | Commenti: 9
Utilizzare il Web Service dei SQL Reporting Services da una pagina ASP.NET
Vedremo in questo articolo un altro modo di utilizzo dei Reporting Services. Mostreremo infatti come consumare il Web Service offerto dai RS per esportare i Reports in vari formati (XML, Excel, PDF, HTML, CSV) e visualizzarli in una pagina ASP.NET.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Visualizzare gerarchicamente i dati con una speciale DataGrid
La rappresentazione grafica di dati gerarchicamente connessi tra loro può essere realizzata anche con l'ausilio di un free control, creato da Denis Bauer, ottenendo un risultato veramente ottimo sia dal punto di vista grafico sia da quello funzionale.
Autore: Andrea Bersi | Difficoltà: | Commenti: 1 | Voto:
Mobile Web Forms e compatibilità tra Device
Ecco un articolo che illustra la creazione di una pagina mobile, tenendo conto delle compatibilità tra vari Device mobili.
Autore: Giovanni Ferron | Difficoltà:
DataSet, CreateChildView, e DataRelation: usare DataGrid per visualizzare dati da 2 tabelle
Un semplice e chiaro esempio per sfruttare al meglio il controllo DataGrid, per la visualizzazione di dati provenienti da 2 tabelle diverse, ma collegate fra loro. Viene spiegato come utilizzare il DataSet per creare delle relazioni tra le tabelle in esso contenute.
Autore: Andrea Bersi | Difficoltà: | Commenti: 1 | Voto:
Caching di pagine ASP.NET
Quando si ha a che fare con l'ingegnerizzazione di un programma la gestione del cache è una cosa importante. La "cache" e' un'area molto veloce (di solito la RAM) dove vengono copiati i dati che necessitano di essere disponibili nel piu breve tempo possibile. Vediamo com'è possibile gestire la Cache in ASP.NET
Autore: Matteo Raumer | Difficoltà:
Paginare un Datalist utilizzando il metodo ReadXml della classe Dataset
Il controllo DataGrid è uno strumento molto completo, ma che a volte può risultare troppo complesso in base alle esigenze della nostra applicazione. In questo articolo verrà spiegato come utilizzare al massimo il controllo DataList, anch'esso ottimo visualizzatore di dati, utilizzando però un'origine dati in formato XML, implementandone la paginazione.
Autore: Matteo Raumer | Difficoltà:
Ridimensionare al volo le immagini uploadate sul server, per creare le ThumbnailImages.
Molto spesso ci capita di voler visualizzare un'anteprima di un'immagine che magari ha grosse dimensioni. In questo articolo verrà spiegato come creare le immagini ridimensionate senza perdita di qualità.
Autore: Valerio Fornito | Difficoltà: | Commenti: 6
Renderizzare automaticamente gli URL come links in formato HTML
Molto spesso ci capita di dover visualizzare nelle pagina web degli URL, letti magari dal DB, ma che non ci vengono visualizzati subito come link cliccabili dall'utente. In questo articolo verrà spiegato come automatizzare questo processo.
Autore: Valerio Fornito | Difficoltà: | Voto:
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5