in

DotNetSide

Dot Net South Italy Developers User Group

Tips

Caricare dinamicamente uno User Control

Autore: Mario Ferrante

Normalmente quando in una pagina aspx sono presenti User Controls, essi devono essere “registrati” nella direttiva @Register della pagina che lo contiene:

<%@ Register Src="[path dello User Control]" TagName="myUC" TagPrefix="uc1" %>

Quindi possono essere richiamati in qualsiasi parte del corpo della pagina attraverso una sintassi di questo tipo:

<uc1:myUC ID="myUC1" runat="server" />

L’IDE di Visual Studio esegue tutto questo lavoro automaticamente, basta trascinare lo User Control appena costruito dalla finestra Solution Explorer all’interno della pagina per vedere comparire la direttiva Register e tutto il resto.

Tuttavia possono capitare situazioni in cui abbiamo la necessità di caricare degli User Control dinamicamente in base ad alcuni eventi, tipo il cambio di valore della Querystring.
Ad esempio, supponiamo di avere tre User Control per gestire l’aggiunta, la visualizzazione e la modifica di clienti in un’applicazione di Commercio Elettronico.
Mettiamo caso che nella pagina customers.aspx, in base al valore della chiave action della querystring, dobbiamo caricare l’User Control appropriato.
La pagina
customers.aspx conterrà sempilecemente un controllo Panel:

1    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="customers.aspx.cs" Inherits="customers" %>
2
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
5 <html xmlns="http://www.w3.org/1999/xhtml" >
6 <head runat="server">
7 <title>Untitled Page</title>
8 </head>
9 <body>
10 <form id="form1" runat="server">
11 <div>
12 <asp:Panel ID="Panel1" runat="server" Width="80%">
13 </asp:Panel>
14 </div>
15 </form>
16 </body>
17 </html>

Nel Code Behind associato alla pagina, customers.aspx.cs avremo:

1    protected void Page_Load(object sender, EventArgs e)
2 {
3 System.Web.UI.Control myUserControl;
4 string action = Request.QueryString["action"];
5 switch (action) {
6 case "add":
7 myUserControl = LoadControl("../Controls/addCustomer.ascx");
8 break;
9 case "update":
10 myUserControl = LoadControl("../Controls/updateCustomer.ascx");
11 break;
12 case "view":
13 myUserControl = LoadControl("../Controls/viewCustomers.ascx");
14 break;
15 default:
16 myUserControl = LoadControl("../Controls/homeCustomers.ascx");
17 break;
18 }
19 this.Panel1.Controls.Add(myUserControl);
20 }

Nell’esempio, il caricamento dinamico dello UC viene inserito nell’evento Load della pagina in base al valore assunto da una querystring, ma è possibile eseguire questa azione all’interno di altri eventi quali il Click di una Button e così via.

Da notare che nella pagina aspx non vi è traccia alcuna della direttiva @Register.

 
Only published comments... Jul 14 2006, 09:42 AM by VitoA
Filed under:
Powered by Community Server (Commercial Edition), by Telligent Systems