Compartir a través de


Definir un evento

Si no está familiarizado con el modelo de delegado de los eventos, vea Controlar y provocar eventos.

Los siguientes elementos proporcionan la funcionalidad de eventos.

  • Clase que contiene los datos de eventos (por ejemplo, EventArgs, ImageClickEventArgs).

  • Delegado de eventos (por ejemplo, EventHandler, ImageClickEventHandler).

    Nota   Las dos clases anteriores generalmente se definen fuera del control. Los dos miembros siguientes se definen en el control.

  • Miembro de evento definido en el control. Se identifica con la clave event.

  • Método del control que invoca a los delegados (por ejemplo, OnClick, OnTextChanged).

En el siguiente ejemplo se defina un evento Click del control personalizado MyButton.

// If the event does not generate data, you do not have
// to define a class for the event data or define an event delegate. 
// Use System.EventArgs for event data
// and System.EventHandler as the event delegate.
// MyButton uses EventHandler and EventArgs.

using System;
using System.Web.UI;

namespace CustomControls 
{  
   public class MyButton: Control, IPostBackEventHandler 
   {     
      // Defines the Click event.
      public event EventHandler Click;

      // OnClick dispatches the event to delegates that
      // are registered with the Click event.
      // Controls that derive from MyButton can handle the
      // Click event by overriding OnClick
      // instead of attaching a delegate. The event data
      // is passed as an argument to this method.
      protected virtual void OnClick(EventArgs e) 
      {     
         if (Click != null) 
         {
            Click(this, e);
         }  
      }
      
      // Method of IPostBackEventHandler that raises change events.
      public void RaisePostBackEvent(string eventArgument)
      {     
         OnClick(EventArgs.Empty);
      }
      
      protected override void Render(HtmlTextWriter output) 
      {     
         output.Write("<INPUT TYPE = submit name = " + this.UniqueID + 
            " Value = 'Click Me' />"); 
      }
   }    
}
[Visual Basic]
' If the event does not generate data, you do not have
' to define a class for the event data or define an event delegate. 
' Use System.EventArgs for event data
' and System.EventHandler as the event delegate.
' MyButton uses EventHandler and EventArgs.
Option Explicit
Option Strict

Imports System
Imports System.Web.UI

Namespace CustomControls
   Public Class MyButton
      Inherits Control
      Implements IPostBackEventHandler
      
      ' Defines the Click event.
      Public Event Click As EventHandler
      
      ' OnClick dispatches the event to delegates that
      ' are registered with the Click event.
      ' Controls that derive from MyButton can handle the
      ' Click event by overriding OnClick
      ' instead of attaching a delegate. The event data
      ' is passed as an argument to this method.
      Protected Overridable Sub OnClick(e As EventArgs)
         RaiseEvent Click(Me, e)
      End Sub
      
      ' Method of IPostBackEventHandler that raises change events.
      Public Sub RaisePostBackEvent(eventArgument As String) Implements IPostBackEventHandler.RaisePostBackEvent
         OnClick(EventArgs.Empty)
      End Sub 'RaisePostBackEvent
      
      Protected Overrides Sub Render(output As HtmlTextWriter)
         output.Write(("<INPUT TYPE = submit name = " & Me.UniqueID & " Value = 'Click Me' />"))
      End Sub
   End Class
End Namespace

Además de definir un evento, el programador de controles también ha de decidir cómo provocar el evento (desde dónde invocar el método OnEventName). Por ejemplo, MyButton provoca el evento Click desde el método RaisePostBackEvent (que forma parte del contrato IPostBackEventHandler). Para obtener más información acerca de este ejemplo, vea Capturar eventos Postback.

Optimizar la implementación de eventos

La implementación de eventos anteriormente descrita no está optimizada para obtener un mejor rendimiento. Genera un campo por cada instancia de un delegado, lo que incrementa el costo de almacenamiento cuando hay muchos eventos definidos en un control. La clase base System.Web.UI.Control proporciona una estructura de datos más eficiente (a través de su propiedad Events) para el almacenamiento y recuperación de delegados de eventos. La propiedad Events es de tipo EventHandlerList, una estructura de datos diseñada para el almacenamiento y recuperación eficiente de los delegados de eventos. En el siguiente ejemplo se muestra la implementación de eventos mediante la propiedad Event. Este ejemplo es distinto al ejemplo MyButton anteriormente definido en este tema únicamente en su implementación del evento Click. El código que implementa este evento está resaltado en negrita.

Nota   Las propiedades de eventos no son compatibles con Visual Basic .NET en esta versión.

using System;
using System.Web.UI;

namespace CustomControls 
{
   public class OptimizedEventButton: Control, IPostBackEventHandler 
   {
      // Defines a key for storing the delegate for the Click event
      // in the Events list.
      private static readonly object ClickEvent = new object();
      
      // Defines the Click event using the event property syntax.
      // The Events property stores all the event delegates of
      // a control as name/value pairs. 
      public event EventHandler Click 
      {
         // When a user attaches an event handler to the Click event 
         // (Click += myHandler;), the Add method 
         // adds the handler to the 
         // delegate for the Click event (keyed by ClickEvent 
         // in the Events list).
         add          {            Events.AddHandler(ClickEvent, value);         }
         // When a user removes an event handler from the Click event 
         // (Click -= myHandler;), the Remove method 
         // removes the handler from the 
         // delegate for the Click event (keyed by ClickEvent 
         // in the Events list).
         remove          {            Events.RemoveHandler(ClickEvent, value);         }
      }
      
      // Invokes delegates registered with the Click event.
      //
      protected virtual void OnClick(EventArgs e) 
      {
         // Retrieves the event delegate for the Click event
         // from the Events property (which stores
         // the control's event delegates). You must
         // cast the retrieved delegate to the type of your 
         // event delegate.
         EventHandler clickEventDelegate = (EventHandler)Events[ClickEvent];         if (clickEventDelegate != null) {            clickEventDelegate(this, e);         }  
      }
      
      // Method of IPostBackEventHandler that raises change events.
      //
      public void RaisePostBackEvent(string eventArgument)
      {
         
         OnClick(new EventArgs());
      }
      
      protected override void Render(HtmlTextWriter output) 
      {
         
         output.Write("<INPUT TYPE = submit name = " + this.UniqueID + 
            " Value = 'Click Me' />"); 
      }
   }    
}

Nota   Para simplificar, algunos de los otros ejemplos que aparecen en la documentación definen los eventos utilizando campos de evento. En los controles, sin embargo, hay que utilizar la implementación optimizada que aquí se describe.

Vea también

Controlar y provocar eventos Ejecutar un evento | Procesar datos de devolución | Capturar eventos Postback | Generar secuencia de comandos en el cliente para la devolución