asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 5540
ASPCode.it - Store

  > > Articoli

Il Controllo Repeater

Data di pubblicazione: 17/04/2003        Voto della community: 4,00 (Votanti: 24)

Il controllo Repeater, come i più diffusi DataList e DataGrid, implementa i comodissimi template, ma a differenza di questi non possiede alcun layout o funzione predefinita, limitandosi essenzialmente a ripetere i dati della sorgente a cui viene collegato. Si presta quindi ad essere usato quando si vuole il massimo controllo sul codice html generato.

Gli elementi del template sono 5, vediamone un impiego tipico (il codice contiene anche un controllo Label1 che sfrutteremo più avanti nell'articolo):


<html>
<head>
</head>
<body>
    <form runat="server">
        <p>
            <asp:Repeater id="Repeater1" runat="server" OnItemCommand="R_ItemCommand" OnItemDataBound="R_ItemDataBound">

                <HeaderTemplate>
                    <table cellpadding=3 cellspacing=0 border="1" width="30%" style="border-style:solid; border-width:1px; border-color:black">
                        <tr>
                            <td>
                                <b>Nome</b>
                            </td>
                        </tr>
                </HeaderTemplate>

                <ItemTemplate>
                    <tr>
                        <td>
                            <asp:LinkButton id="miolink" Text='<%# DataBinder.Eval(Container.DataItem, "nome") %>' Runat="server" />
                        </td>
                    </tr>
                </ItemTemplate>
               
               
                <SeparatorTemplate>
                  <td align=center>
                    <hr width="80%">
                  </td>
                </SeparatorTemplate>
               
                <AlternatingItemTemplate>
                    <tr>
                        <td bgcolor="silver">
                            <asp:LinkButton id="miolink" Text='<%# DataBinder.Eval(Container.DataItem, "nome") %>' Runat="server" />
                        </td>
                    </tr>
                </AlternatingItemTemplate>

                <FooterTemplate>
                    </table>
                </FooterTemplate>

            </asp:Repeater>
        </p>
        <p>
            <asp:Label id="Label1" runat="server">Label</asp:Label>
        </p>
    </form>
</body>
</html>

Il 'cuore' del template - che è l'unico elemento da definire obbligatoriamente - è l'ItemTemplate, e contiene necessariamente una espressione databinding che definisca il collegamento  con la sorgente dei dati, cioé una espressione del tipo <%#Container....%> o <%#DataBinder.Eval(Container....)%>; il Repeater ripeterà tale elemento per ogni dato presente nella sorgente dei dati. Nell'esempio, l'elemento contiene (oltre ai tag <tr><td>..) un server control di tipo LinkButton che ricava il testo del link dal campo "nome" della sorgente dati.
La sorgente dati puo' essere una qualsiasi struttura dati che implementi l'interfaccia IEnumerable, ad esempio un Array, un DataSet, un DataView etc.
L'AlternatingItemTemplate deve contenere anch'esso una espressione di tipo <%#Container(....)%> poiché altro non è che un elemento da visualizzare alternatamente all'elemento ItemTemplate (nell'esempio il contenuto è uguale all'ItemTemplate, eccetto per il background della cella). Gli altri elementi non possono invece contenere espressioni di collegamento alla sorgente dati; come si intuisce dai termini, l'HeaderTemplate e il FooterTemplate definiscono il codice html da visualizzare una volta sola, rispettivamente all'inizio e alla fine (in questo caso nell'HeaderTemplate viene creata una tabella con la relativa intestazione e nel Footer troviamo la chiusura), mentre il SeparatorTemplate specifica il codice da visualizzare come separatore fra gli elementi che si ripetono (nell'esempio una cella contenente una riga).

Il codice sopra riportato non produce naturalmente alcun output finché non viene definita la sorgente dati per il controllo e effettuato il DataBinding.
Vediamo dunque un codice che definisce una struttura dati e la collega a tale Repeater per la rappresentazione.


<%@ Page Language="C#" Debug="true" %>
<script runat="server">

    void Page_Load(Object Sender, EventArgs e)
      {
       
          if (!IsPostBack)
          {
   
            ArrayList persone = new ArrayList();
            persone.Add(new Persona ("m", "Antonio"));
            persone.Add(new Persona ("m", "Giacomo"));
            persone.Add(new Persona ("f", "Angela"));
            persone.Add(new Persona ("f", "Anna"));
       
            Repeater1.DataSource = persone;
            Repeater1.DataBind();
          }
   
      }
   
    void R_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
   
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
   
          if ( ((Persona)e.Item.DataItem).sesso == "f") {
            ((LinkButton)e.Item.FindControl("miolink")).Text= "<i>" + ((Persona)e.Item.DataItem).nome + "</i>";
          }
        }
    }
   
    void R_ItemCommand(Object Sender, RepeaterCommandEventArgs e) {
   
        Label1.Text="Hai selezionato: "  + ((LinkButton)e.CommandSource).Text;
    }
   
    public class Persona {
 
          private string _sesso;
          private string _nome;
   
          public Persona(string sesso, string nome) {
            _sesso = sesso;
            _nome = nome;
          }
   
          public string sesso { get { return _sesso; } }
          public string nome  { get { return _nome;} }
      }
</script>


A runtime, nell'evento Page_Load verifichiamo che non si tratti di un PostBack e creiamo una sorgente dati di tipo ArrayList contenente una serie di istanze della classe Persona, che possie due proprietà, sesso e nome; quindi impostiamo tale ArrayList come sorgente dati per il Repeater e effettuiamo il DataBinding del controllo.
L'output sarà una lista (con la formattazione più sopra definita) di link con nomi di persone, e in corsivo i nomi delle persone di sesso femminile.

Per modificare il "comportamento" a runtime del Repeater (ovvero visualizzare i nomi di persone di sesso femminile in corsivo) abbiamo sfruttato l'evento OnItemDataBound del Repeater. Tale evento viene 'lanciato' dal controllo immediatamente prima del rendering di ciascun elemento del template. La procedura collegata all'evento (R_ItemDataBound) riceve un argomento di tipo RepeaterItemEventArgs che fornisce informazioni sull'elemento in questione del Repeater; in particolare e.Item.ItemType contiene a runtime il tipo dell'elemento. Con l'if verifichiamo che si tratti di un elemento di tipo ItemTemplate o AlternatingItemTemplate, confrontandolo con gli omonimi valori di ListItemType; in caso positivo ci serviamo dell'oggetto e.Item.DataItem, che conterrà una certa istanza della classe Persona; tramite il casting (conversione) in oggetto Persona, possiamo leggere la proprietà 'sesso' e eventualmente modificare la proprietà Text del LinkButton tramite il metodo e.Item.FindControl("miolink").

Un altro evento dell'oggetto Repeater sfruttato dal codice è l'evento OnItemCommand che viene generato in corrispondenza dell'evento Click su un controllo LinkButton (oppure Button o ImageButton) contenuti nel template, grazie alla propagazione (event bubbling) dei rispettivi eventi al controllo Repeater che li contiene; in questo caso l'eventhandler (la nostra R_ItemCommand) riceve un argomento di tipo RepeaterCommandEventArgs che possiede fra le altre una proprietà (CommandSource) che restituisce il controllo che ha generato l'evento; quindi ((LinkButton)e.CommandSource).Text ci dà il testo del linkbutton che è stato cliccato, che visualizziamo nella Label1.




Utenti connessi: 5540