Uno dei punti di forza di ASP.NET 1.1 è stato quello di dare la possibilità a chiunque di potersi sviluppare i propri controlli web.
In base alle esigenze possiamo creare custom control o user control(ascx).
I custom control a loro volta possono essere composite control o rendered control. A tal proposito c'e' un bel post di J.Palermo che descrive come decidere quale tipologia di custom controls implementare.
Può capitare di dover estendere un controllo esistente creandone uno composito.
Mi spiego con un esempio.
Voglio creare un text box che permetta di inserire l'ora nel formato hh:mm e che ne validi l'obbligatorietà e la correttezza del formato, usando i validator di ASP.NET.
Mi trovo nella situazione in cui il controllo che devo fornire è comunque una textbox estesa, ma "per colpa" dei controlli validator, sono obbligato a creare un composite control.
Creo quindi il mio custom control che deriva da WebControl, creo le proprietà della text box che non ha WebControl e.....mi ritrovo con il problema di dover riapplicare tutte le proprietà di WebControl impostate a design sulla text box stessa.
Tramite la proprietà ControlStyle ed il metodo ApplyStyle riesco ad ottenere con il minimo sforzo quello che voglio, ossia fare in modo che qualsiasi stile impostato a design si applichi alla textbox del controllo composito.
protected
override void CreateChildControls()
{
...
// this è il controllo composito, deriva da WebControl
this._timeText.ApplyStyle(this.ControlStyle);
...
// resetto lo stile sul controllo composito(uno span)
this.ControlStyle.Reset();
...
}
Il comando this.ControlStyle.Reset() fa in modo che vengano tolti gli stili sullo span che viene disegnato come rendering del WebControl.
Piccola nota, si potrebbe evitare del tutto che venga disegnato lo span, e quindi l'utilizzo della ControlStyle.Reset se sovrascriviamo il metodo Render ed applichiamo direttamente la RenderControl solo dei controlli text box e validator.
protected
override void Render(HtmlTextWriter writer)
{
this._timeText.RenderControl(writer);
this._requiredValidator.RenderControl(writer);
}