9.06.2009

Eventos, Delegados en C#

Eventos, Delegados en C# paso a paso
Ante las constantes preguntas en foros y las que me hacen los visitantes; decidi explicar paso a paso como crear un evento y aplicarlo en algo muy comun, teniendo dos formularios abiertos pasar datos o hacer que la acción en el Secundario ( Form2 ) implique simultaneamente en el Primario (Form1).
Haber, la parte teórica creo que ya es conocida por todos y que ni leendo 3 veces te queda la idea clara bien, vamos al meollo del asunto.

CASO:
Se tienen dos formularios, Form1 - Form2 ; ambos obviamente en el ambiente WinForm CSharp, se quiere invocar al formulario 2 (Form2) desde el Form1 con un Boton, luego desde un boton del Form2 cambiaremos el Titulo del Form1.

SOLUCION : (paso a paso) te va a funcionar :-)

1.- Iniciamos Visual Studio, click File >> New >> Project >> Visual C# (Izquierda) >> Windows Forms Applications.
Name : w01
Location: C:\practica (una carpeta cualquiera)
Click en OK!

2.- Por Defecto tenemos un Form1, necesitamos otro formulario (Form2); Menu Project >> Add Windows Form >> Click Botón Add.
3.- Diseño del Formulario 1 (Form1)


Botón:
Name : btnMostrar
text : Form2


4.- Diseño del Formulario 2 (Form2)



Controles
Label1 :
Text: Ingrese Titulo para Form1
TexBox1:
Name: txtTitulo
Button:
Name: btnEnviar
Text: Enviar
5.- En el Form2 creamos el Evento y Delegado.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace w01
{
public partial class Form2 : Form
{
// Delegado
public delegate void DelegadoTitulo(string mensaje);
//Evento
public event DelegadoTitulo MiEvento;
public Form2()
{
InitializeComponent();
}
private void btnEnviar_Click(object sender, EventArgs e)
{
// Al evento Click del Boton invocamos el Evento y pasamos el TEXTO
this.MiEvento(txtTitulo.Text);
}
}
}

6.- Ahora en el Form1 recibimos el parámetro y hacemos que se ejecute nuestro método ()
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace w01
{
public partial class Form1 : Form
{
// Instanciamos un objeto de FORM2
Form2 formulario = new Form2();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Invocamos al Evento
//PonerTitulo es un método
formulario.MiEvento += new Form2.DelegadoTitulo(PonerTitulo);
}
//Metodo de Form1 que pondrá el titulo al Form
void PonerTitulo(string mensaje)
{
this.Text = mensaje;
}
private void btnMostrar_Click(object sender, EventArgs e)
{
// Mostrar formulario (objeto de Form2)
formulario.Show();
}
}
}

7.- Ejecutando

Espero que les ayude ...

7 comentarios:

Anónimo dijo...

Hola, esta muy bueno el ejemplo, tengo una pregunta, se podria crear un delegado tambien en form2 para cambiar el titulo a form1... le agradezco si me ayuda con esta duda.

Anónimo dijo...

no se entendio nada

Anónimo dijo...

Nesecito leer un dato ingresado en el textbox del formulario de origen a otro formulario no se si pueda ser algo similar SOS

Pelayo dijo...

Me parece un ejemplo muy clarificador, enhorabuena y mil gracias!

Oscar Ochoa dijo...

Hey Excelente!!! funciono exacto lo que necesitaba 1000 gracias!!!

Solo una pregunta cuando cierro el form2 e intento abrirlo de nuevo me da error.
me dice que no se puede tener acceso al objeto eliminado.
Como se puede solucionar ese error?

Oscar Ochoa dijo...

Ya pude solucionar el problema para que al cerrar el formulario y volverlo a abrir se pueda seguir enviando informacion.
La solucion es poner en el botonEnviar del Form1 el codigo para instanciar el form2 y para agregar el evento.

private void btnMostrar_Click(object sender, EventArgs e)
{
form2 formulario = new form2();
formulario.MiEvento += new form2.DelegadoTitulo(PonerTitulo);
// Mostrar formulario (objeto de Form2)
formulario.Show();
}

Anónimo dijo...

TA que chevere tio me salvastes de una gran craneada que tenia que pensar me la isistes mas facil me sirvio de mucho chevere tu ayuda gracias sigue aportando asi mas ..!