Creare controlli utente custom compositi con ASP.NET

di: Giuseppe Marchi     03 Ottobre 2007

La gestione degli eventi

All'interno del metodo CreateChildControls(), è stato definito l'handler per l'evento Click del bottone, uno dei controlli figlio del nostro controllo composito.

btnCommand.Click += new EventHandler(btnCommand_Click);

Questo evento viene scatenato correttamente, ma sarà possibile gestirlo solo all'interno del controllo. Una volta inserito il controllo in una pagina ASP.NET, non possiamo più assegnargli un delegato. Possiamo dire che siamo andati "al di fuori del contesto" (scope) dell'evento.

Per questo motivo, abbiamo la necessità di aggiungere un evento al nostro controllo composito che possa essere gestito dalla pagina Web che lo ospita e che venga scatenato al click del bottone. Per farlo, creiamo un evento e lo aggiungiamo alla collezione di eventi del controllo (rappresentata dalla proprietà Events). Poi creiamo il relativo gestore.

Definire un evento

private static readonly object eventKey = new object();

[Browsable(true), Category("Action")]
public event EventHandler Save
{
  add
  {
    Events.AddHandler(eventKey, value);
  }
  remove
  {
    Events.RemoveHandler(eventKey, value);
  }
}

protected virtual void OnSave(EventArgs e)
{
  EventHandler handler = (EventHandler)Events[eventKey];
  if (handler != null)
  {
    handler(this, e);
  }
}

Infine, all'interno del gestore dell'evento Click del nostro bottone, va scatenato il nostro evento custom.

protected void btnCommand_Click(object sender, EventArgs e)
{
  OnSave(EventArgs.Empty);
}

Come ultimo accorgimento da prendere, possiamo impostare l'evento Save come predefinito aggiungendo l'attributo DefaultEvent tra quelli che già decoravano la classe.

[DefaultEvent("Save"), DefaultProperty("Caption"), ToolboxData("<{0}:CustomerDetail runat=\"server\"> </{0}:DettagliUtente>")]
public class DettagliUtente : CompositeControl

A questo punto, lo sviluppo del nostro controllo composito può considerarsi concluso.

Utilizzo

Per inserire il nuovo controllo nelle pagine dobbiamo, come sempre, registrare il controllo. Possiamo poi modificarne le proprietà e gestirne gli eventi.

Inserire il controllo in una pagina Web

<%@ Register Namespace="HTMLit.Web.UI.WebControls" TagPrefix="HTMLit" %>

<script runat="server">
protected void SalvaDatiCliente(object sender, EventArgs e)
{
  // eventuale salvataggio di dati nel database

  lbl.Text = String.Format("Nome: {0}<br />" + "Cognome: {1}<br />" + "Telefono: {2}",
    detail.Nome,
    detail.Cognome,
    detail.Telefono);
}

Il controllo risulta semplice da usare, per merito dell'incapsulamento: abbiamo racchiuso diversi comportamenti in un unico oggetto, per creare una nuova, unica, funzionalità avanzata.

Conclusioni

Lo sviluppo di controlli compositi è un campo in cui è un piacere addentrarsi, in quanto è possibile creare oggetti unici che racchiudono funzionalità e comportamenti nuovi rispetto a quelli offerti dai controlli già presenti all'interno del .NET Framework. Il tutto poi, può essere reso personalizzabile, in modo da poter distribuire il controllo ed utilizzarlo in più contesti possibili tra loro differenti. Siamo limitati solamente dalla nostra fantasia.

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto