asp - asp.net - aspcode.it

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

  > > Articoli

Utilizzo di funzioni nei controlli Repeater, DataList e DataGrid

Data di pubblicazione: 26/05/2003        Voto della community: 4,13 (Votanti: 5)


In un precedente articolo (Il controllo Repeater) spiegavo come formattare in maniera particolare degli elementi del controllo Repeater che rispettassero certe condizioni durante la fase di esecuzione o runtime. In quell'esempio, c'era un controllo Repeater collegato ad un arraylist di oggetti persona con le proprietÓ sesso e nome, e l' ItemTemplate / AlternatingItemTemplate conteneva un linkbutton che 'pescava' il testo del link dal campo nome della sorgente collegata; era poi definita una procedura che gestiva l'evento OnItemDataBound, la quale, a runtime, risaliva alle proprietÓ sesso e nome di ciascun elemento e - se il sesso risultava femminile - modificava la formattazione del testo del linkbutton visualizzandolo in corsivo. L'output era dunque una serie di link con nomi di persone e in corsivo i nomi di persone di sesso femminile.

Vediamo qui come raggiungere lo stesso risultato impiegando una funzione all'interno  dell'ItemTemplate/AlternatingItemTemplate (la tecnica vale chiaramente anche per i controlli DataList e DataGrid):

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

    private string nomeformattato (string _sesso, string _nome) {
   
        if (_sesso=="f")
   
          return "<i>" + _nome + "</i>";
   
        else
   
        return _nome;
   
    }
   
   
    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_ItemCommand(Object Sender, RepeaterCommandEventArgs e) {
   
        Label1.Text="Hai cliccato: "  + ((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>



<html>
<head>
</head>
<body>
    <form runat="server">
        <p>
            <asp:Repeater id="Repeater1" runat="server" OnItemCommand="R_ItemCommand">
                <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='<%#nomeformattato((string)DataBinder.Eval(Container.DataItem, "sesso"),(string)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='<%#nomeformattato((string)DataBinder.Eval(Container.DataItem, "sesso"),(string)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>

Come si vede, rispetto alla soluzione precedente, manca del tutto la procedura che gestiva l'evento OnItemDataBound. Abbiamo invece definito un metodo nomeformattato (in VB avremmo dichiarato una Function nomeformattato) con due parametri, _sesso e _nome, il quale restituisce il parametro _nome in corsivo se il sesso Ŕ femminile (cioÚ se il parametro _sesso Ŕ "f") o _nome stesso in caso contrario. Nella definizione della proprietÓ Text del LinkButton troviamo quindi:

<%#nomeformattato((string)DataBinder.Eval(Container.DataItem, "sesso"),(string)DataBinder.Eval(Container.DataItem, "nome"))%>

che richiama a runtime nomeformattato passando come parametri i campi 'sesso' e 'nome' correnti del Container.

Questa soluzione Ŕ quindi indicata quando si vuole gestire una proprietÓ di un controllo contenuto nel Repeater (in questo caso il 'Text' del LinkButton) con una procedura ad hoc, mentre la gestione dell'evento OnItemDataBound sembra pi¨ indicata quando si vuole accedere, nella stessa procedura (la procedura che gestisce l'evento), a pi¨ proprietÓ di un controllo o pi¨ controlli contenuti nel Repeater (queste, ricordiamo, sono infatti accessibili attraverso il metodo FindControl("nomecontrollo").nomeproprietÓ, ad esempio, e.Item.FindControl("miolink")).Text) ).




Utenti connessi: 6074