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 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
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!