E' un pò che ho iniziato ad utilizzare le librerie di oggetti proposti da ATLAS, emh... scusate, da ASP.NET 2.0 AJAX Extension, e devo dire che mi sto trovando abbastanza bene; infatti con poco sforzo è possibile inserire delle funzionalità AJAX nelle proprie pagine web gia esistenti.

Oggi, mi è capitato di dover inserire un TextBoxWatermarkExtender via codice, in un mio server control. Tale extender aggiunge quella funzionalità che permette di visualizzare un messaggio se l'utente non ha selezionato l'area di testo della TextBox.
Il meccanismo di inserimento di un extender, risulta essere lo stesso di un qualsiasi web control:

namespace Peppe.Web.UI.WebControls

{
[ToolboxData("<{0}:SearchBox runat=server></{0}:SearchBox>")]
public class SearchBox : Control, INamingContainer
{
protected System.Web.UI.WebControls.TextBox txtSearch;
protected System.Web.UI.WebControls.Button btnSearch;
protected TextBoxWatermarkExtender extender;

protected override void CreateChildControls()
{
txtSearch = new TextBox();
txtSearch.ID = "txtSearch";
this.Controls.Add(txtSearch);

btnSearch = new Button();
btnSearch.ID = "btnSearch";
btnSearch.Text = "Search";
btnSearch.PostBackUrl = "~/search.aspx";
this.Controls.Add(btnSearch);

extender = new TextBoxWatermarkExtender();
extender.ID = "extenderSearch";
TextBoxWatermarkProperties prop = new TextBoxWatermarkProperties();
prop.WatermarkText = "Type text here ...";
prop.TargetControlID = "txtSearch";
extender.TargetProperties.Add(prop);
this.Controls.Add(extender);
}

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
txtSearch.RenderControl(writer);
writer.Write(" ");
btnSearch.RenderControl(writer);
extender.RenderControl(writer);
}
}
}

A questo punto, vedendo il l'ottimo risultato ottenuto, mi sono detto: "sarebbe meglio controllare anche che la TextBox nn sia vuota prima che venga effettuato il PostBack". E quindi ho cercato di inserire il RequiredFieldValidator, ma dopo vari tentativi, ho scoperto che la convivenza tra questi due controls non è ancora supportata. Lo spiega questa issue.
Speriamo che venga risolta nella prossima release di AtlasControlToolkit.