Recuperare più facilmente le istanze dei controlli in un Template sfruttando l'attributo TemplateInstanceAttribute

di Marco Leoncini, in ASP.NET 2.0, Web Controls, UserScript,

Quando realizziamo custom control che fanno utilizzo di Template, per recuperare i riferimenti alle istanze dei controlli utilizziamo in genere il metodo FindControl(), che ci obbliga a cercare il controllo all'interno del contenitore.
Decorando la proprietà che restituisce l'oggetto ITemplate con l'attributo TemplateInstanceAttribute è possibile accedere ai controlli dichiarati nel Template, come faremmo con qualsiasi altro controllo contenuto nella pagina.

Per prima cosa, realizziamo un semplice control, esponiamo una proprietà del tipo ITemplate e decoriamola con l'attributo TemplateInstanceAttribute, passando al costruttore il valore Single dell'enumeratore TemplateIstance:

namespace TestWebControl
{
  public class MyControl : Control
  {
    ITemplate myTemplate;

    [Browsable(false)]
    [DefaultValue(null)]
    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateInstance(TemplateInstance.Single)]

    public ITemplate MyTemplate
    {
      get { return myTemplate; }
      set { myTemplate = value; }
    }

    public MyControl() { }

    public override ControlCollection Controls
    {
      get
      {
        EnsureChildControls();
        return base.Controls;
      }
    }

    protected override void CreateChildControls()
    {
      if (MyTemplate != null)
      {
        Control content = new Control();

        Controls.Add(content);

        MyTemplate.InstantiateIn(content);
      }
    }
  }
}

Fatto questo, inseriamo il controllo appena creato nella cartella /App_Code/ (oppure in una class library) e registriamolo nella pagina.

<%@ Register TagPrefix="Sample" Namespace="TestWebControl" %>

Aggiungiamo quindi al Template una semplice Label:

<Sample:MyControl runat="server" ID="test">
  <MyTemplate>
    <asp:Label runat="server" ID="MyLabel"></asp:Label>
  </MyTemplate>
</Sample:MyControl>

Sarà cosi possibile accedere direttamente alla Label nel nostro codice, senza usare FindControl, così:

protected void Page_Load(object sender, EventArgs e)
{
  MyLabel.Text = "ASPItalia.com";
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi