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

 


per leggere il post originale o inviare un commento visita il seguente indirizzo: ASP.NET 2.0: Advanced Wev User Controls