ASP.NET: Single Value e Repeated Data Binding

Corso ASP.NET: ottava puntata

Esempio funzionante | Sorgente | Scarica il sorgente (zip)

Il Data Binding è un metodo usato da ASP.NET per collegare dei dati ad un controllo Web. Lo scopo è di facilitare l’integrazione tra la pagina ASP.NET e le sorgenti dati riducendo la scrittura di codice per la gestione. Il Data Binding può essere di due tipi:

  • Single Value, quando si lega un solo valore al controllo
  • Repeated Value, quando si gestiscono collezioni o record

Single Value Data Binding

Vediamo in azione per primo il Single Value Data Binding. Potete come sempre provare l’esempio online.

I Single Value Data Binding possono essere usati con le Proprietà, i Metodi, le Espressioni e i Controlli

L’esempio illustra come sia possibile applicare i Single Value Data Binding a 4 realtà:

  1. le Proprietà
  2. i Metodi
  3. le Espressioni
  4. i Controlli

Nel caso di una proprietà, l’esempio imposta il percorso e le dimensioni di un’immagine:

68 <asp:Image id="immagine" runat="server" ImageUrl="<%# UrlImmagine %>" Width="<%# WidthImmagine %>" Height="<%# HeightImmagine %>" />

# UrlImmagine, # WidthImmagine e # HeightImmagine rappresentano il “collegamento” con le proprietà dell’immagine.
Il codice che realizza le proprietà, poco indicativo vista la semplicità dell’esempio, è il seguente:

 17 ReadOnly Property UrlImmagine() As String
 18   Get
 19     Return "images/parigi.jpg"
 20   End Get
 21 End Property
 22 
 23 ReadOnly Property WidthImmagine() As Unit
 24   Get
 25     Return Unit.Pixel(200)
 26   End Get
 27 End Property
 28 
 29 
 30 ReadOnly Property HeightImmagine() As Unit
 31   Get
 32     Return Unit.Pixel(291)
 33   End Get
 34 End Property

La corrispondenza proprità/controllo non è automatica: dovete esplicitamente richiamare il “binding” tra i dati nel Page_Load, con un’istruzione del tipo:

 36 Sub Page_Load(sender as Object, e as EventArgs)
 37 
 38   DataBind()  
 39   
 40 End Sub

Oltre a livello di pagina, il Data Binding può essere richiamato esplicitamente per ogni controllo.

Come per le proprietà, il codice è molto simile anche per i metodi e le espressioni e vi rimandiamo al codice sorgente dell’esempio.

È interessante notare come il Data Binding sia possibile anche tra due controlli:

100     <form runat=”server”>
101 
102     <asp:DropDownList id="Colori" runat="server">
103      <asp:ListItem>Rosso</asp:ListItem>
104      <asp:ListItem>Verde</asp:ListItem>
105      <asp:ListItem>Giallo</asp:ListItem>
106      <asp:ListItem>Arancione</asp:ListItem>
107      <asp:ListItem>Celeste</asp:ListItem>
108      <asp:ListItem>Nero</asp:ListItem>
109      <asp:ListItem>Bianco</asp:ListItem>
110     </asp:DropDownList>
111 
112     <input type="submit" value="Invia" runat="server">
113 
114     <p>
115 
116     Hai scelto il colore: <asp:label text=’<%# Colori.SelectedItem.Text %>‘ runat="server" />
117 
118     </form>

In questo caso, il valore del controllo label dipende dall’elemento selezionato nel DropDownList.

Repeated Value Data Binding

Il Repeated Data Binding evita la scrittura di cicli per iterare tra collezioni e record. Se pensate alle normali applicazioni, questo rappresenta buona parte del lavoro di una pagina.

Le sorgenti dati che è possibile utilizzare con i Repeated Data Binding sono molteplici, tra cui Collection, ArrayList e gli oggetti forniti da ADO.NET (DataView, DataSet e DataReader).

La pagina d’esempio visualizza alcune sorgenti di dati collegate ad una ArrayList, una HashTable e una SortedList.

Tra i vari casi presentati, che potete analizzare approfonditamente osservando il codice dell’esempio, ci soffermiamo sulla HashTable, che è visualizzata in un controllo di tipo Repeater.

Il controllo Repeater ha il compito di ciclare gli elementi di una sorgente dati e di visualizzarli secondo un template stabilito da chi costruisce la pagina.

Ecco il codice che realizza la lista di prodotti e prezzi:

118     <hr noshade="true" size="1" width="100%">
119         
120     <asp:Repeater id="acquisti" runat="server">
121 
122    <HeaderTemplate>
123    <table border="0" cellpadding="0" cellspacing="0">
124    <tr>
125      <td width="100" bgcolor="#C0C0FF"><b>Bene</b></td>
126      <td width="100" bgcolor="#C0C0FF"><b>Prezzo</b></td>
127    </tr>
128    </HeaderTemplate>
129     
130       <ItemTemplate>
131           <tr>
132             <td width="100" bgcolor="#FFFFC0"><%# Container.DataItem.Key %></td>
133             <td width="100" bgcolor="#FFFFC0"><%# DataBinder.Eval(Container.DataItem,"Value","{0:c}") %></td>
134           </tr>
135       </ItemTemplate>
136       
137       <AlternatingItemTemplate>
138           <tr>
139             <td width="100" bgcolor="#C0C0C0"><%# DataBinder.Eval(Container.DataItem,"Key") %></td>
140             <td width="100" bgcolor="#C0C0C0"><%# DataBinder.Eval(Container.DataItem,"Value","{0:c}") %></td>
141           </tr>
142       </AlternatingItemTemplate>
143       
144       <SeparatorTemplate>
145           <tr>
146             <td colspan="2" width="200" background="images/separatore.gif" height="17" bgcolor="#C0FFC0"><img src="images/space.gif" height="1"></td>
147           </tr>
148       </SeparatorTemplate>
149 
150    <FooterTemplate>
151    </table>
152    </FooterTemplate>
153       
154     </asp:Repeater>

Anche se non entriamo nel dettaglio, ma vi rimandiamo all’approfondita documentazione Microsoft, il Repeater è un controllo che deve il suo funzionamento ad una serie di “template” che ripete per tutti i dati della sorgente dati associata.

Il questo esempio, i template utilizzati sono:

  • Header: visualizza un’intestazione che precede l’elenco dei valori
  • ItemTemplate: il template con il quale sono visualizzate le righe dispari di dati (se presente AlternatingItemTemplate, altrimenti tutte le righe)
  • AlternatingItemTemplate: il template (se presente) con il quale sono visualizzate le righe dispari di dati
  • SeparatorTemplate: cosa visualizzare tra una riga e l’altra di dati
  • FooterTemplate: come chiudere la visualizzazione della sorgente dati

Ci rimane da vedere il codice che, durante il Page_Load, lega il Repeater con la sorgente dati (in questo caso una Hash Table).

 50   Dim htAcquisti as New HashTable(4)
 51   
 52   htAcquisti.Add("Latte",1500)
 53   htAcquisti.Add("Burro",4000)
 54   htAcquisti.Add("Pane",2500)
 55   htAcquisti.Add("Pasta",2000)
 56 
 57   acquisti.DataSource = htAcquisti

È creata una Hash Table contenente 4 elementi, una descrizione ed un valore. Successivamente viene associata la sorgente dati (con il metodo DataSource) al Repeater. Infine, come avviene con il Single Value Data Binding, è scatenato “l’aggancio” tra controllo e dati:

 72   Page.DataBind()

All’interno del controllo Repeater sono richiamati:

  • Container.DataItem.Key – questa scrittura indica di visualizzare la chiave della Hash Table (il nome del prodotto) dell’elemento sul quale il controllo sta ciclando. Per riferirsi al controllo associato è sufficiente utilizzare Container come nome dell’oggetto
  • DataBinder.Eval(Container.DataItem,”Value”,”{0:c}”) – qui vogliamo prelevare il valore del prodotto (Value), ma non ci basta: vogliamo anche convertirlo in valuta

Conclusione

Il Data Binding è tra le funzionalità più potenti e personalizzabili di ASP.NET, soprattutto se si considera che la maggior parte delle applicazioni accede a sorgenti dati. È possibile sfruttare il Data Binding sia con dati semplici e univoci, sia con collezioni. Ma il loro uso più efficace, come vedremo la prossima puntata, è con le basi di dati e ADO.NET.

Un pensiero su “ASP.NET: Single Value e Repeated Data Binding

  1. Ancora complimenti, mi sto’ divorando una puntata dietro l’altra (peggio di lost :)

    AlternatingItemTemplate: il template (se presente) con il quale sono visualizzate le righe dispari di dati

    ->

    AlternatingItemTemplate: il template (se presente) con il quale sono visualizzate le righe pari di dati

I commenti sono chiusi.