Introduzione
In una logica di programmazione basata su i controlli è normale avere la necessità di creare eventi per comunicare con la pagina o più in generale con l'oggetto contenitore. In questo articolo vedremo come fare passo dopo passo.
Nonostante la tecnica per la gestione degli eventi nei controlli server e nei controlli client (ascx) sia identica, la solution allegata contiene esempi di realizzazione con entrambi i tipi di controllo.
Cosa vogliamo realizzare?
Un semplice controllo dotato di un textbox e un pulsante. Alla pressione del pulsante il controllo deve generare un evento in cui notifica il valore contenuto nella textbox. La Pagina contenitore intercetta l'evento del controllo e scrive il testo notificato in una label.
Lista della spesa: Di cosa abbiamo bisogno?
1) un Delegate: un delegate è un modo per rappresentare la signtaure di un metodo: Quanti e quali parametri deve avere e qual'è il tipo restituito dalla funzione? Nel nostro caso rappresenta "come deve essere fatta" la funzione di risposta all'evento http://msdn.microsoft.com/it-it/library/900fyy8e(en-us).aspx
2) un Evento: Semplicemente abbiamo bisogno di definirlo come attributo e specificare il delagate a cui fa riferimento
Parte 1 - Prepariamo il nostro evento:
Iniziamo con il dichiarare nel nostro controllo il delegate e l'evento:
/// <summary>
/// Event Delegate: How answering function must be?
/// </summary>
/// <param name="text"></param>
public delegate void dlgSubmitText(string text);
/// <summary>
/// Evant object refearing to dlgSubmitText
/// </summary>
public event dlgSubmitText SubmitText;
In pratica abbiamo detto che nel nostro controllo esiste un evento la cui funzione di risposta ha un parametro di tipo stringa e non restisce valori.
Parte 2 - Invochiamo l'evento
Dobbiamo intercettare la pressione del pulsante interno al controllo in modo da poter generare l'evento.
void Btn_Click(object sender, EventArgs e)
{
//Retrive TextBox object
TextBox Txt = (this.FindControl("Txt") as TextBox);
//Invoke Event with txt.text as parameter
//!!! It's important to check if SubmitText is managed by (SubmitText != null) before to invoke event
if (SubmitText != null){SubmitText.Invoke(Txt.Text);}
}
E' molto importante ricordarsi l'if(SubmitText != null) perchè se l'evento non fosse gestito dal contenitore avremmo un'eccezione.
Parte 3 - Il controllo è pronto proviamolo:
Creiamo una pagina aspx per gestire il contollo ed il suo evento. Nel nostro caso quando intercettiamo l'evento scriviamo il testo che ci arriva come parametro in una label.
ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Namespace="wmb" TagPrefix="wmb" %>
<%@ Register Src="~/MyAscxControl.ascx" TagPrefix="wmb" TagName="MyAscxControl" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<wmb:MyControl id="MyControl" runat="Server" OnSubmitText="MyControl_SubmitText"></wmb:MyControl><br />
<wmb:MyAscxControl ID="AscxControl" runat="server" OnSubmitText="AscxControl_SubmitText" /><br />
<br />
<asp:Label ID="lblResult" runat="server"></asp:Label>
</div>
</form>
</body>
</html>
CS:
public partial class _Default : System.Web.UI.Page
{
/// <summary>
/// Custom event Managment (Server Control)
/// </summary>
/// <param name="text"></param>
public void MyControl_SubmitText(string text)
{
lblResult.Text = "Server Event Text:" + text;
}
/// <summary>
/// Custom event Managment (Ascx Control)
/// </summary>
/// <param name="text"></param>
public void AscxControl_SubmitText(string text)
{
lblResult.Text = "ASCX Event Text:" + text;
}
}
Conclusioni e Sorgente:
Come avete potuto vedere il procedimento è molto semplice, flessibile ed offre grandi possibilità.
Per ogni suggerimento su come migliorare quest'articolo, domande o altro scrivetemi pure.
posted @ sabato 24 maggio 2008 13:00