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

di , 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

Recuperare più facilmente le istanze dei controlli in un Template sfruttando l'attributo TemplateInstanceAttribute (#822) 1010 2
| 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