Oggi mi è capitato di costruire un web control un pò particolare. Doveva essere l'insieme di più elementi input html, che dovevano scatenare entrambi degli eventi PostBack.
Ho creato quindi una classe che eredita da Control e che implementa l'interfaccia IPostBackEventHandler. Questa interfaccia, che consente di configurare il proprio web control per ricevere eventi PostBack, obbliga a definire il metodo RaisePostBackEvent, metodo con il compito di chiamare l'event handler per un nostro evento custom; nel mio caso, ho creato un evento Click.
Vediamo il codice:
public class TemplateList : Control, IPostBackEventHandler, INamingContainer
{
public event EventHandler Click;
public string SelectedItem
{
get
{
if (ViewState["SelectedItem"] != null)
return String.Format("{0}", ViewState["SelectedItem"]);
else
return String.Empty;
}
set { ViewState["SelectedItem"] = value; }
}
protected virtual void OnClick(EventArgs e)
{
if (Click != null)
{
Click(this, e);
}
}
public void RaisePostBackEvent(string eventArgument)
{
SelectedItem = eventArgument;
OnClick(new EventArgs());
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<input type=\"image\" " +
"name=\"uno\" " +
"id=\"uno\" " +
"onclick=\"" + Page.ClientScript.GetPostBackEventReference(this, "uno") + "\" " +
"src=\"img1.gif\" />");
writer.Write("<input type=\"image\" " +
"name=\"due\" " +
"id=\"due\" " +
"onclick=\"" + Page.ClientScript.GetPostBackEventReference(this, "due") + "\" " +
"src=\"img2.gif\" />");
}
}
In questo modo, ad ogni click su una delle due immagini, viene popolata la proprietà SelectedItem.