Custom Event in Custom Control

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

Print
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011