Chiunque abbia cominciato ad utilizzare ASP.NET avrà senz'altro provato controlli come il Repeater, la DataList o il DataGrid. Sono controlli molto potenti e utili perché ci rendono molto produttivi e si basano su due funzionalità delle class library di ASP.NET: templates e ViewState.
Il primo ci permette di definire del codice HTML/ASP.NET da riutilizzare più volte e ne abbiamo parlato approfonditamente in passato . Il secondo è un meccanismo fondamentale per ASP.NET e mantiene informazioni durante i post di ogni pagina.
In questo articolo modificheremo il controllo Repeater (il più semplice dei tre) al fine di darci la possibilità di rappresentare la sorgente dati, raggruppandola per alcuni elementi.
Per comprendere meglio cosa voglia dire, l'esplora risorse di Windows è un esempio calzante.
Costruzione del custom control
Il controllo dovrà solo preoccuparsi di effettuare un rendering differente, ma non di raggruppare i dati. Sarà compito nostro fornire una sorgente dati unita e ordinata e quindi rendere possibile questa funzionalità.
Doteremo quindi il nostro controllo di due proprietà:
- GroupTemplate : per definire l'HTML di suddivisione ogni nuovo gruppo;
- DataGroupField : per indicare qual è il campo della sorgente che farà come punto di riferimento per il raggruppamento.
Per esempio, se abbiamo una lista di contatti e vogliamo raggrupparla per la prima lettera, potremmo definire una query SQL simile a questa:
SELECT Cognome, LEFT(Cognome,1) AS Gruppo FROM contatti ORDER BY Cognome ASC
Il result set risultante avrà la lista dei cognomi in ordine alfabetico con un campo gruppo indicante la prima lettera del cognome. Il GroupRepeater controllerà questo campo; ad ogni cambio di lettera inserirà un nuovo GroupTemplate.
Il controllo poi provato darà un risultato come questo:
Ovviamente layout e dati sono completamente personalizzabili.
Costruzione della classe
Iniziamo con il definire la classe del nostro custom control ereditando da System.Web.UI.WebControls.Repeater , poiché quello che faremo è aggiungere o ridefinire delle funzionalità del controllo base e sfrutteremo dunque le funzionalità già presenti:
public class GroupRepeater : System.Web.UI.WebControls.Repeater { ... }
Stabiliamo ora le due proprietà che abbiamo stabilito ci serviranno per la personalizzazione:
public string DataGroupField { get { object o = ViewState["DataGroupField"]; if (o != null) return (string)o; else return String.Empty; } set { ViewState["DataGroupField"] = value; } } [TemplateContainer(typeof(RepeaterItem)), PersistenceMode(PersistenceMode.InnerProperty)] public virtual ITemplate GroupTemplate { get { return this._groupTemplate; } set { this._groupTemplate = value; } }
La prima mantiene il nome del campo nel ViewState, la seconda l'istanza del nuovo template. Ricordo solo che l'attributo TemplateContainer indica di che tipo sarà la proprietà Container, alla quale possiamo sempre accendere in fase di binding, come è stato spiegato in questo articolo .
L'aspetto che più ci deve interessare in questa fase è invece come vengono creati gli items del Repeater. I tre data control hanno una caratteristica in comune: una volta fatto il caricamento dei dati dalla fonte, non necessitano ad ogni PostBack della pagina di un ulteriore binding. Ci viene infatti ormai automatico scrivere nel Page_Load questo codice:
if (!IsPostBack) caricaDati();
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.