Pubblicato da: cursao11 | marzo 11, 2009

Data repeter

Giornata di grande apprendimento oggi…
onestamente non sono mai stato un grande fruitore di repeter, normalemente sono solito usare altri oggetti, come datagrid, dropdownlist etc. etc. Tuttavia quest’oggetto consento un  livello di personalizzazione non indefferente, permettondo di definire dei template per l’header, il footer, il separatore, e gli oggetti in esso contenuti.

In passato quando ho usato oggetti repeter, dopo aver definito gli opportuni template per header, footer, separator e item:

<div class=”rpContent”>
<span><img class=”rpImmagine” src=”images/icons/ruolo.jpg” alt=”” /></span>
<span class=”rpId”><img class=”rpImmagine1″ src=”images/icons/sep.jpg” alt=”” />
ID=”lblID” runat=”server” Width=”10px”> </span>
<span class=”rpDescrizione”><img class=”rpImmagine1″ src=”images/icons/sep.jpg” alt=”” />
ID=”lblDescrizione” runat=”server” Width=”100px”></span>
</div>

definivo:
– un metodo per il popolamento dei dati.
– un metodo che viene invocato dall’evento dataBound su ciascun elemento del repeter:

//contenuto del metodo <nomeRepeter>_ItemBound
Security _s = ((Security)e.Item.DataItem);

//devo popolare correttamente i campi//codice
Label _ruoloID = ((Label)e.Item.FindControl(“lblID”));
_ruoloID.Text = _s.RUOLO_ID.ToString();

//descrizione del ruolo
Label _ruoloDescrizione = ((Label)e.Item.FindControl(“lblDescrizione”));
_ruoloDescrizione.Text = _s.RUOLO.NOME;

come si vede dal codice di cui sopra, con questa tecnica, dobbiamo andare a recuperare gli oggetti da modificare.
Per evitare di dover gestire l’evento ItemBound, e per rendere la pagina più performante possiamo decidere di immergere il codice di binding direttamente nell’html, piuttosto che nel metodo <nomeRepeter>_ItemBound, in questo modo:

<asp:Repeater ID=”rpRuoli” runat=”server” OnItemDataBound=”rpRuoli_ItemDataBound”>
<ItemTemplate>
<div class=”rpContent”>
<span><img src=”images/icons/ruolo.jpg” class=”rpImmagine” /></span>&nbsp;
<span class=”rpId”><img src=”images/icons/sep.jpg” class=”rpImmagine1″ />&nbsp;<asp:Label
ID=”lblID” runat=”server” Width=”10px” Text='<%# ((Security)Container.DataItem).RUOLO_ID        %>’></asp:Label>&nbsp;</span>&nbsp;
<span class=”rpDescrizione”><img src=”images/icons/sep.jpg” class=”rpImmagine1″ /><asp:Label
ID=”lblDescrizione” runat=”server” Width=”100px” Text='<%# ((Security)Container.DataItem).RUOLO.NOME %>’></asp:Label></span>
</div>
</ItemTemplate>
</asp:Repeater>

osservando l’ultima porzione di codice, possiamo vedere come sia possibile utilizzare la tecnica del binding anche con oggetti sviluppati da noi:

((Security)Container.DataItem).RUOLO.NOME

in questo caso, l’oggetto contenuto nella nostra sorgente dati (che deve essere associato al repeter, tramite la proprietà DataSource del repeter) è di tipo Security, e contiene al suo interno l’oggetto di tipo Ruolo, che contiene una proprietà NOME di tipo stringa.

Text='<%# ((Security)Container.DataItem).RUOLO.NOME %>’

impostando la proprietà Text della label lblDescrizione in questo modo, quando eseguiamo il metodo DataBind() del nostro repeter (dopo aver impostato la proprietà DataSource con la nostra sorgente dati), non dobbiamo preoccuparci più di nulla. Per ogni oggetto Security della fonte dati, verrà creata una label contenente il nome del ruolo relativo.

Per ora mi fermo qui…domani vedremo come paginare il repeter, utilizzando una sorgente dati paginata, ed un secondo repeter come pulsantiera…

alla prssima


Lascia un commento

Categorie