I Web User Controls, più spesso conosciuti con il diminutivo di
"ascx" per l'estensione che contraddistingue il loro template, sono sovente
sottovalutati per la loro intrinseca facilità di uso. Questo è un grave errore
in cui si incorre nell'errata supposizione che la loro semplicità sia ottenuta
sacrificando la l'estensibilità tipica dei Custom Web Controls. COn questo breve
esempio vorrei dimostrarvi quanto sto dicendo; Poniamo di creare un semplice
UserControl come segue:
<%@ Control
Language="C#"
CodeFile="TemplatedUserControl.ascx.cs"
Inherits="TemplatedUserControl" %>
<asp:Table
runat="server"
ID="tblTris"
CellPadding="5"
CellSpacing="0"
BorderStyle="None">
<asp:TableRow>
<asp:TableCell />
<asp:TableCell />
<asp:TableCell />
</asp:TableRow>
<asp:TableRow>
<asp:TableCell />
<asp:TableCell />
<asp:TableCell />
</asp:TableRow>
<asp:TableRow>
<asp:TableCell />
<asp:TableCell />
<asp:TableCell />
</asp:TableRow>
</asp:Table>
Come evidente si tratta di uno UserControl che contiene una
semplice tabella con nove celle, distribuite su tre colonne per tre righe. Ora
andiamo a modificare la classe che implementa la logica dello UserControl:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
public partial class TemplatedUserControl : System.Web.UI.UserControl
{
private ITemplate buttonTemplate;
protected override void OnInit(EventArgs e)
{
int i = 0;
foreach (TableRow row in tblTris.Rows)
{
foreach (TableCell cell in row.Cells)
{
ButtonTemplateContainer container = new ButtonTemplateContainer();
ButtonTemplate.InstantiateIn(container);
WebControl textControl = container.FindControl("TitleText") as WebControl;
cell.Controls.Add(container);
if (textControl != null)
{
textControl.Width = textControl.Height = Unit.Pixel(50);
if (textControl is ITextControl)
((ITextControl)textControl).Text = i.ToString();
else if (textControl is IButtonControl)
((IButtonControl)textControl).Text = i.ToString();
}
i++;
}
}
base.OnInit(e);
}
[PersistenceMode(PersistenceMode.InnerProperty)]
[Browsable(false)]
[TemplateContainer(typeof(ButtonTemplateContainer))]
public ITemplate ButtonTemplate
{
get { return buttonTemplate; }
set { buttonTemplate = value; }
}
}
public class ButtonTemplateContainer :
Control,
INamingContainer
{
}
Questo codice, trasforma lo UserControl appena creato in un
semplice ed efficace TemplateControl. In pratica nelle nove celle viene
iniettato il template generato sulla base di quanto richiesto nel markup. Ecco
come è possibile usare lo UserControl:
<Elite:TemplatedUserControl runat="server" ID="ucTest">
<ButtonTemplate>
<asp:Button runat="server" ID="TitleText" />
</ButtonTemplate>
</Elite:TemplatedUserControl>
In breve sarà possibile configurare un template
in ogni istanza configurata dello UserControl allo stesso modo di quello che si
farebbe con una GridView. Come evidente le potenzialità degli UserControls vanno
ben aldilà di quallo che si può di primo acchito
pensare.
powered by IMHO 1.3