I Data Controls DataList e Repeater

di Daniele Bochicchio, in ASP.NET,

I web controls che ASP.NET ci mette a disposizione per formattare i dati all'interno di una pagina sono comunemente noti come Data Controls , per via delle loro capacità di visualizzare dati.

Questa trattazione sarà ampia ed occuperà anche prossimi articoli, ma sin da questo inizieremo a vedere i concetti che sono alla base di questi web controls.

Una base comune

I principali web controls della famiglia dei Data Controls sono essenzialmente tre:

  • Repeater
  • DataList
  • DataGrid

Esiste infine un piccolo gruppo, noto come List Controls , a cui abbiamo già accennato negli articoli precedenti e che grossomodo rispecchiano le caratteristiche di questi che andremo ad esaminare.

Questi controls rappresentano un approccio differente alla visualizzare dei dati, ma tutti e tre hanno lo stesso fine in comune.

Condividono una serie di proprietà comuni, oltre che la sintassi simile nel databinding (che vedremo subito cosa rappresenta) e quindi nell'approccio allo sviluppo, semplificandolo.

Come avremo modo di vedere, ognuno ha però caratteristiche differenti, che ne rendono uno più utile in determinati contesti ed operazioni rispetto agli altri.

La scelta tra questi tre web controls è dunque dettata delle caratteristiche offerte, che ritornano utili per certe applicazioni piuttosto che altre.

Il DataGrid ad esempio ha meccanismi già pronti per l'implementazione delle funzionalità di paginazione ed ordinamento dei dati, caratteristica assenti negli altri. Al contrario, il DataGrid può generare come output solo una tabella HTML, mentre il DataList, ma soprattutto il Repeater, hanno maggiore flessibilità in tal senso e perciò risultano più utili in progetti più complessi dal punto di vista grafico o della pulizia del codice HTML o XHTML.

DataList e DataGrid poi ereditano dalla classe BaseDataList , contenuta sempre nel namespace System.Web.UI.WebControls , ma soprattutto da WebControl , a differenza di Repeater, il che permette lro di avere a disposizione proprietà legate allo stile (quindi font, colori di sfondo, etc). Con Repeater come detto è tutto da creare.

In comune tutti hanno una proprietà DataSource , che serve per specificare la sorgente dei dati, un metodo DataBind() per associare questi dati, e tre eventi:

  • ItemCreated : si verifica all'aggiunta di ogni singolo item al Data Control.
  • ItemDataBound : si verifica quando viene effettuata l'associazione dei dati su ogni singolo item.
  • ItemCommand : si verifica quando un control contenuto in un item richiede l'esecuzione di un comando.

Tra l'altro anche l'associazione dei dati è uguale per tutti i controls esaminati, si tratta di impostare la fonte dati attraverso la proprietà DataSource e poi richiamare il metodo DataBind() per associare i dati al control.

Ogni control è infatti a suo volta composto da un numero di controls identificati dal suffisso Items presente nel nome, dove per il DataGrid abbiamo la collezione DataGridItems , per il DataListi DataListItems e per il Repeater RepeaterItems .

Dunque a parte nomi diversi, i control che ogni Data Control contiene all'interno essenzialmente servono per fare un ciclo sui dati e visualizzarli. Ma tutto questo come avviene?

Il DataBinding

Alla base dei Data Controls c'è quindi un meccanismo particolare, chiamato DataBinding , ovvero in Italiano associazioni di dati. Attraverso questo concetto risulta molto più semplice visualizzare anche grosse quantità di dati.

Se facciamo un attimo un pensiero al recordset di ADO e quindi alla modalità di estrazione dei dati (ovvero, ciclica, ma scritta da noi) questo nuovo approccio all'estrazione e visualizzazione dei dati non può che risultare più comoda.

Tra gli altri vantaggi, come si può notare, c'è una netta separazione tra codice necessario ad effettuare l'associazione della fonte e l'estrazione dei dati, e la loro visualizzazione, basata alla fine su un insieme di segnaposto dei valori contenuti nella fonte dati.

Questo nuovo modo di operare si rivela molto utile quando si tratta di variare il layout: diventa molto più semplice perché di fatto il codice non viene interessato dalla modifica e si evita l'effetto spaghetti code , ovvero il miscuglio di codice HTML e script.

Il DataBinding non è però prerogativa solo dei Data Controls: in linea generale un po' tutti i controls supportano questa feature , ma è con i Data Controls che diventa molto ma molto interessante.

Cosa succede dietro le quinte quando invochiamo il metodo DataBind dei Data Controls?

Quando noi associamo la fonte dati attraverso la proprietà DataSource e quindi richiamiamo il metodo DataBind() del nostro Data Control, ciò che succede è in realtà questo: per prima cosa, viene enumerata la fonte dati, ovvero viene fatto un ciclo su ogni elemento contenuto all'interno della fonte.

Nel caso di un DataSet, viene fatto un ciclo sulla collezione Rows contenuta nel DataTable di default. All'interno della collezione Rows troviamo una serie di instanze di DataRow , che altro non sono che riferimenti ad un record estratto dal database.

Quindi, per ogni DataRow è creato un RepeaterItem (nel caso di un Repeater), viene invocato l'evento ItemCreated e la DataRow è associata alla proprietà DataItem del RepeaterItem. Viene quindi invocato l'evento ItemDataBound ed il ciclo continua con i record successivi.

<%# Container.DataItem("nomecolonna")%>
<%# DataBinder.Eval(Container.DataItem, "nomecolonna")%>>

Le due istruzioni sono equivalenti in termini di funzionalità.

La seconda utilizza un particolare costrutto che permette di valutare il contenuto del DataItem (verificando che non sia nullo, convertendolo, etc) ed è utile nel suo overload a tre parametri, dove l'ultimo rappresenta la formattazione da applicare al DataItem.

Se il control in gioco dovesse essere il DataGrid, il concetto sarà simile, ma ovviamente avremo a che fare con un DataGridItem in luogo di un RepeaterItem. Stesso discorso per il DataList, con DataListItem.

Come si può notare il meccanismo che sta alla base del DataBinding è semplice, ma il fatto stesso che sia già implementato, di default, da questi control e che quindi non sia necessario fare un ciclo per visualizzare i dati rende lo sviluppo più immediato e veloce.

Alcuni di questi control poi si basano esclusivamente sui templates, un mix di codice HTML ed istruzioni di databinding. Ce ne sono di diverso tipo e li analizzeremo nel corso della trattazione di ogni singolo Data Control.

Il Data Control Repeater

Cominciamo dunque l'analisi più approndita dei Data Controls partendo dal più semplice e flessibile di tutti.

Si tratta essenzialmente di un control molto semplice, che non eredita da WebControl (a differenza degli altri due) e che quindi già in questo mostra ciò per cui è nato: ripetere un certo layout estraendo i dati dalla fonte.

E' obbligatorio specificare un template, a differenza del DataGrid, per i dati estratti. Dunque la visualizzazione è basata su template e sono supportati i seguenti tipi:

  • alternatingItemTemplate
  • ItemTemplate
  • HeaderTemplate
  • FooterTemplate
  • SeparatorTemplate

L'utilizzo dei template è di facile intuizione: permettono di specificare un codice da associare a determinate parti del Repeater e come vedremo anche gli altri Data Controls ne fanno uso.

L'unico veramente indispensabile è ItemTemplate, che indica il template che ogni item dovrà usare. Segue l'alternatingItemTemplate, che serve per visualizzare un record alternato e quindi per mostrare (ad esempio) un testo di colore diverso sulla riga dispari visualizzata.

HeaderTemplate, FooterTemplate e SeparatorTemplate servono rispettivamente per impostare un'intestazione, un piè di pagina o un separatore tra i vari elementi della collezione RepeaterItems.

E' una delle scelte migliori quando c'è solo da estrarre e visualizzare dati, senza paginazioni o ordinamenti di mezzo, oppure quando volete produrre codice XHTML, cosa impossibile con DataList (con alcune proprietà impostate) ed assolutamente improbabile con il DataGrid.

3 pagine in totale: 1 2 3

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti