Passa ai contenuti principali

VB.NET : GridView con paginazione selezionata dall'utente

Sul sito della community romana del mondo .NET (www.dotnetromacesta.org) trovate un mio piccolo articolo su come realizzare un controllo ASP.NET, derivato dal controllo GridView, che permette all’utente di selezionare il numero di record da visualizzare.

Per semplicità riporto l’intero articolo rimandandovi al link di cui sopra per scaricare il file con il codice.

La nostra GridView modificherà il pager della GridView originale suddividendolo in due colonne, la prima delle quali conterrà il controllo di paginazione originale (normalmente contenuto in una cella con l’attributo ColumnSpan pari al numero di colonne della griglia), mentre la seconda conterrà una label e una drop down list con i possibili valori della paginazione (recuperati da una nuova proprietà che l’utente può impostare da codice).

Creiamo, dunque una classe che chiameremo DynamicPageSizeGridView e che deriverà dalla GridView contenuta nel namespace System.Web.UI.WebControls.

Definiamo tre proprietà pubbliche:

PageSizeList : elenco dei possibili valori selezionabili dall’utente. Si tratta di una stringa composta da valori numerici separati dal carattere “;” ;

PageSelectorText : testo che comparirà al fianco del controllo di selezione del numero di record;

PageSelectorCssClass : classe di stile della cella contenente la label e la dropdown di selezione.

Tutte e tre le proprietà sfruttano il viewstate per memorizzare i valori in modo da mantenerli tra un post back ed il successivo:

Public Property PageSelectorText() As String
   Get
        Dim _PageSelectorText = Me.ViewState("PageSelectorText")
        Return CStr(_PageSelectorText)
    End Get
    Set(ByVal value As String)
        Me.ViewState("PageSelectorText") = value
    End Set
End Property

Per creare fisicamente i controlli di gestione della paginazione, andiamo a gestire l’evento RowCreated ed in particolare ci occupiamo di agire sulla riga di tipo Pager:

Private Sub DynamicPageSizeGridView_RowCreated( _

        ByVal sender As Object, _
        ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
        Handles Me.RowCreated
    If e.Row.RowType = DataControlRowType.Pager Then
        Dim pagerControl = e.Row.Cells(0).Controls(0)
        e.Row.Cells(0).Controls.Clear()
        e.Row.Cells(0).Controls.Add(CreatePagerTable(pagerControl))
    End If
End Sub

In particolare andiamo a salvarci il controllo PagerTable che contiene il controllo di paginazione originale (che si trova nell’unica cella della riga di paginazione) e creiamo una tabella con una riga e due colonne. Nella prima di queste colonne (entrambe che occupano il 50% dello spazio) rimettiamo il paginatore originale, mentre nella seconda costruiamo i due controlli per la selezione del numero di record per pagina.

Function CreatePagerTable(ByVal pagerControl As Control) As Table
    Dim table = New Table()
    Dim row As New TableRow
    Dim pagerCell As New TableCell
    With pagerCell
        .Width = Unit.Percentage(50)
        .Controls.Add(pagerControl)
    End With
    row.Cells.Add(pagerCell)
    Dim sizeCell As New TableCell
    With sizeCell
        .CssClass = Me.PageSelectorCssClass
        .Width = Unit.Percentage(50)
        Dim label = New Label()
        label.Text = Me.PageSelectorText
        .Controls.Add(label)
        .Controls.Add(CreatePageSizeListDropDown())
    End With
    row.Cells.Add(sizeCell)
    table.Rows.Add(row)
    table.Width = Unit.Percentage(100)
    Return table
End Function

Nella funzione CreatePageSizeListDropDown creiamo la dropdown per la selezione della dimensione di paginazione:

Private Function CreatePageSizeListDropDown() As DropDownList
    Dim combo = New DropDownList()
    combo.Items.AddRange((From s In Me.PageSizeList.Split(CChar(";")) _
                      Where IsNumeric(s) _
                      Order By s Ascending _
                      Distinct Select New ListItem(s, s)).ToArray())
    combo.AutoPostBack = True
    combo.SelectedValue = Me.PageSize.ToString()
    AddHandler combo.SelectedIndexChanged, _
    AddressOf Me.ComboPageSizeSelectionChanged
    Return combo
End Function

Da notare l’utilizzo di LINQ per creare la lista dei valori possibili di paginazione contenuti nella proprietà PageSizeList.

Nell’evento di cambio dell’indice della dropdown effettuiamo il cambio di paginazione:

Protected Sub ComboPageSizeSelectionChanged( _
        ByVal sender As Object, _
        ByVal e As EventArgs)
    Dim combo = CType(sender, DropDownList)
    Dim selectedValue = combo.SelectedItem.Value
    Me.PageSize = System.Convert.ToInt32(selectedValue)
    Me.PageIndex = 0
End Sub

Recuperiamo il valore selezionato dall’utente, impostiamo il valore del PageSize e riportiamo il PageIndex a zero. Quest’ultima istruzione serve a garantire che, se ci si trova in una pagina diversa dalla prima e si seleziona una paginazione per cui esiste una sola pagina, non si abbia un errore.

A questo punto tutto sembra funzionare ma se selezioniamo una paginazione con un numero di record maggiore del numero di record totali della sorgente dati, scompare la riga di paginazione non consentendo più di cambiare il valore selezionato.

Per risolvere questo problema ci viene in aiuto un post di Ryan McDonnell(link) in cui si spiega come fare in modo di visualizzare sempre la riga di paginazione anche se il numero di record totali è minore del numero di record della pagina.

In sostanza è sufficiente implementare l’override della proprietà PageCount (utilizzata dal frame work per sapere quante pagine servono per visualizzare tutti i dati):

Public Overrides ReadOnly Property PageCount() As Integer
    Get
        Dim basePageCount = MyBase.PageCount
        If basePageCount = 1 Then
            Dim sf = New System.Diagnostics.StackFrame(1)
            If sf.GetMethod().Name = "CreateChildControls" _
                And sf.GetMethod().ReflectedType.Name = "GridView" Then
                    basePageCount += 1
            End If
        End If
        Return basePageCount
    End Get
End Property

Nel momento in cui ci si accorge che il numero di pagine necessarie per visualizzare i dati è pari ad 1 (cioè non viene visualizzata la riga di paginazione), si incrementa tale valore in modo da “ingannare” il framework e fargli , comunque, disegnare la riga di paginazione (priva del paginatore perché, effettivamente, non ci sono record su cui navigare).

In questo modo la nostra griglia è perfettamente funzionante.

Da notare che il tutto funziona sia con la paginazione lato server che con quella lato client.

Il codice sorgente è disponibile al seguente indirizzo

http://www.dotnetromacesta.org/common/articoli/aspnet/gridview/AspNet_GridView_Paginazione.aspx

Commenti

Post popolari in questo blog

MVP Reconnect …… ovvero quando entri nella “famigghia” resti sempre nella “famigghia”!!!

Ma di che “famigghia” stiamo parlando!!!!

Fermi tutti, non si tratta di robe strane o sette segrete o affari malavitosi….stiamo parlando della grande famiglia dei Microsoft MVP.

Per chi non sapesse cosa sono i Microsoft MVP, vi consiglio di fare un giro sul sito ufficiale del programma (link), ma, volendolo spiegare in pochisime parole, si tratta di un riconoscimento che Microsoft da a persone che si distinguono per il loro impegno, aiutando gli altri ad ottenere il massimo grazie alle tecnologie Microsoft. Si tratta di persone, non dipendenti Microsoft, che mettono la loro passione, il loro tempo, la loro buona volontà per la divulgazione e la condivisione della conoscenza. Non necessariamente (come qualcuno erroneamente sostiene, evidentemente non conoscendo le basi del programma) si tratta di professionisti nel termine letterale del termine ma si tratta comunque di un gruppo di persone che sacrifica un pò del suo tempo (e, a volte, vi assicuro neanche pò!!!) per la sua passione.

Pe…

Nuova versione del Band SDK

E’ di ieri l’annuncio del rilascio della nuova versione dell’SDK per il Microsoft Band.
Si tratta della versione 1.3.10417 (la precedente e, prima della serie, era la 1.3.10219 preview).
Maggiori informazioni, download dell’SDK per le tre piattaforme Windows Phone, iOS e Android all’indirizzo http://developer.microsoftband.com/.
Allo stesso indirizzo potrete trovare anche la documentazione.
Nei mesi scorsi mi sono gia’ occupato della precedente versione e questi sono i post che ne parlano:
Microsoft Band SDK Preview - First LookMicrosoft Band SDK Preview - ”Hello Band”Microsoft Band SDK Preview - Accesso ai sensoriMicrosoft Band SDK Preview - TileMicrosoft Band SDK Preview - NotificheMicrosoft Band SDK Preview - Personalizzazione
Gli argomenti trattati e il codice proposto dovrebbe, ad una prima lettura delle nuove funzionalita’ inserite, essere ancora valido e funzionante ma nei prossimi giorni prendero’ in esame tutti gli argomenti dei precedenti post e vedremo cosa cambia e cosa e’ …

Template di progetto per sviluppare applicazioni WPF con Intel® RealSense™

E’ disponibile, nella gallery di Visual Studio, la prima versione del mio template di progetto per applicazioni WPF scritte in C# che permette di realizzare applicazioni con l’SDK di Intel® RealSense™.Il template si può scaricare direttamente all’interno Visual Studio utilizzando il tool “Extensions and Updates”oppure all’indirizzo https://visualstudiogallery.msdn.microsoft.com/1c36ecfd-8c00-4aee-b20c-a1726ab6424dIl template esegue le seguenti operazioni per voi:Aggiunge la reference all’assembly libpxcclr.cs.dll (nelle due distinte versioni per x86 e x64);Aggiunge lo script di post build per copiare la libreria libpxccpp2c.dll dalla cartella dell’SDK alla cartella bin del vostro progetto.Una volta creato il progetto dovete rimuovere la configurazione di compilazione AnyCPU (che non ha più senso) dalla vostra solution e sarete pronti per sviluppare con Intel® RealSense™.Ovviamente dovete installare l’SDK che potete scaricare all’indirizzo https://software.intel.com/en-us/intel-realsen…