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.
L’esempio illustra come sia possibile applicare i Single Value Data Binding a 4 realtà:
- le Proprietà
- i Metodi
- le Espressioni
- i Controlli
Nel caso di una proprietà, l’esempio imposta il percorso e le dimensioni di un’immagine:
# 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:
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:
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:
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:
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).
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:
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.
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