Delegados para eventos !!! ( en C# 2.0 )

Como es de conocimiento de todo el mundo, un evento es una ocurrencia dentro del ambiente de un programa que provoca que un event handler realice alguna acción en respuesta. Transportándonos a comparaciones, podemos decir que esto es análogo muchas veces a un excepción que es levantado y asignado a su respectivo exception handler. Es así que es importante saber que un evento es un tipo de referencia, es por eso que, el manejo de un evento es logrado usando una técnica de de recuperación llamada callback (conocida como función de retorno). Todo esto es parte de la programación de eventos  la cual, por cierto, es muy común dentro de las interfaces gráficas del usuario, donde la entrada del usuario, como un click notifica a uno o más event handlers para reaccionar en respuesta a esta activación.

Entendiendo todo lo anterior, podemos ilustrar un ejemplo donde se usa delegados para tratar eventos. Para la demostración haremos uso de un ejemplo. Para esto crearemos la clase Empleado con el atributo Nombre (único campo, para la ilustración), también declaramos un evento llamado changed con event handler tipo UpdateEventHandler que se lanzará cuando se halla modificado el nombre del empleado. La idea es que después de ingresar el nombre del empleado, el programa nos emita un mensaje de confirmación. Asi que si ingresamos como nombre, por ejemplo, "Percy", se debe imprimir el mensaje "data changed !".

//Delegado handler del evento Changed
public delegate void UpdateEventHandler();

public class Empleado
{
    //campo
    private string Nombre;

    //... resto de atributos..

    //declaración del evento con su Event Handler "UpdateEventHandler"
    public event UpdateEventHandler changed;

    public Empleado()
    {//direccionamiento del evento changed
        //para que levante el método messageChanged
        this.changed += new UpdateEventHandler(messageChanged);
    }

    public void setNombre(String s)
    {
        //seteamos la data
        this.Nombre = s;

        //se levanta el evento changed               
        this.changed();
    }

    internal void messageChanged()
    {
        //imprimos mensaje de conformidad.
        Console.WriteLine("data changed !");
    }          

}

static void Main(string[] args)
{
    //instanaciamos un objeto myData
    Empleado data = new Empleado();
    //fijamos el dato
    data.setNombre(Console.ReadLine());
    Console.ReadLine();
}

Es así que en el constructor de esta clase, fijamos el event handler asignándole el método messageChanged como método de respuesta para este evento changed. En el método setNombre modificamos el campo Nombre, para luego lanzar el evento changed, informando de esta manera que el proceso ha sido realizado con éxito.

Hemos terminado y de esta manera podemos sacarle partida a la programación de eventos usando delegados.El motivo de este post fue tan sólo de darle una idea de lo que se puede hacer usando esta combinación de delegates y eventos.

Percy Reyes.

Published 6/2/2007 19:13 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2007/02/06/delegados-para-eventos-en-c-2-0.aspx

Comentarios

# re: Delegados para eventos !!! ( en C# 2.0 )

HOla de nuevo

Una cosilla, normalmente los eventos suelen ser declarados para que el que use tu clase los implemente, no para que se implementen dentro de la clase, algo así:

public class Empleado

{

   //campo

   private string Nombre;

   //... resto de atributos..

   //declaración del evento con su Event Handler "UpdateEventHandler"

   public event UpdateEventHandler changed;

   public Empleado()

   {

   }

   public void setNombre(String s)

   {

       //seteamos la data

       this.Nombre = s;

       //se levanta el evento changed                

       this.changed();

   }

}

   static internal void messageChanged()

   {

       //imprimos mensaje de conformidad.

       Console.WriteLine("data changed !");

   }

static void Main(string[] args)

{

   //instanaciamos un objeto myData

   Empleado data = new Empleado();

//direccionamiento del evento changed

       //para que levante el método messageChanged

       data.changed += new UpdateEventHandler(messageChanged);

   //fijamos el dato

   data.setNombre(Console.ReadLine());

   Console.ReadLine();

}

Pero ojo con esto, porque antes de levantar el evento deberemos de comprobar que no sea null, o lo que es lo mismo, que alguien (en este caso Main) se haya suscrito a nuestro evento.

saludos.

Wednesday, February 07, 2007 8:14 AM por Neu

# re: Delegados para eventos !!! ( en C# 2.0 )

aja, esa es la idea, gracias por ese detalle.

Percy Reyes.

Thursday, February 08, 2007 1:11 PM por Percy Reyes

# re: Delegados para eventos !!! ( en C# 2.0 )

oye percy y como hago para que los eventos los reciba en otro hilo?

Thursday, March 01, 2007 12:14 AM por Abraham

# re: Delegados para eventos !!! ( en C# 2.0 )

No sabe trabajar con hilos el tal Percy, asi que no le hagas ese tipo de preguntas xD.

Monday, April 14, 2008 6:43 PM por Mauro

# Delegados en C#

Delegados en C#

Wednesday, May 07, 2008 6:15 AM por Oberdata

# re: Delegados para eventos !!! ( en C# 2.0 )

Pues a mi no me funciono, yo necesito hacer eso pero en dos pantallas diferentes (en dos clases diferentes)

Tuesday, September 09, 2008 4:25 PM por Manuel

# re: Delegados para eventos !!! ( en C# 2.0 )

A mi no me funciono, tengo FormaA y FormaB

en formaA hago esto:

public delegate void AceptarCancelarClick(Button Boton, System.EventArgs e);

y esto:

public event AceptarCancelarClick AceptarCancelar;

en formaA tengo un boton y hago esto en el click del boton:

       protected void btnAceptarC_Click(object sender, EventArgs e)

       {            

           if (AceptarCancelarClick != null)

           {

               AceptarCancelarClick(btnAceptarC, e);

           }

       }  

y en formaB pretendo hacer una accion cuando se de clik al boton de formaA y hago esto:

       protected void AceptarCancelar_Click(Button boton, EventArgs e)

       {

       }

AceptarCancelar += new EventHandler(AceptarCancelar_Click);

Pero me da error

No overload for 'AceptarCancelar_Click' matches delegate

Ayuda

vazquezvega@hotmail.com

Gracias.

Tuesday, September 09, 2008 4:30 PM por Manuel

# re: Delegados para eventos !!! ( en C# 2.0 )

no teneis ni idea, eso son preguntas de niño de primaria.

estudiar un poco hombre

Friday, November 14, 2008 12:59 PM por pepe

# Eventos y delegados

Mira:

Estoy trabajando en proyecto de aprendizaje de C# en el cual tengo incrustado un TabControl, en dicho TabControl tengo 6 tabs habilitados con 13 textbox cada uno y tengo la necesidad de validar el ingreso de datos en cada textbox, es decir debo verificar que se ingresen sólo relaes (floats o doubles), para lo cual existe un evento tipo keypress y otro de tipo keyup el keypress lo utlizo para las validadciones...Pero imagina tener que utilizar 78 ó más metodos keypress para validar una entrrada en cada textbox...

¿Cómo le hago para que cuando me pare en un textbox cualquiera pueda emplear en metodo generico que valide el textbox dado?

Debo emplear delegados o dbo crear un metodo que llame al evento y llamar dicho metodo según el caso? Si es así como le hago

Thursday, March 19, 2009 6:56 PM por Carlos

# re: Delegados para eventos !!! ( en C# 2.0 )

Que simpatico eres pepe....

Monday, March 23, 2009 2:38 PM por Linka

# re: Delegados para eventos !!! ( en C# 2.0 )

En vez de criticarse, por qué no se ayudan!

Thursday, March 26, 2009 9:52 PM por Ariel

# re: Eventos y delegados

Para Carlos, (el de los TabControls), lo que debes es crear una clase que herede de la clase TextBox (sobreescribirla) y alli sobreescribes los metodos keypress y keyup a tu gusto.

Luego agregas esos nuevos textbox (digamos textboxplus) a tu formulario y no tienes que estar reecribiendo código por cada uno.

Wednesday, July 15, 2009 4:51 PM por Carlos González

# re: Delegados para eventos !!! ( en C# 2.0 )

la verdad no me funcionaron los ejemplos me tira un error al implementar el primer ejemplo

Friday, August 14, 2009 10:00 PM por Rolando estudiante de sistemas 3 año

# re: Delegados para eventos !!! ( en C# 2.0 )

esto esta muy chido

Tuesday, May 04, 2010 6:50 PM por Cesar