eventos entre forms

Moderador: raul338

C#, tambien llamado C Sharp

eventos entre forms

Notapor ciberjuanma » Mar Ene 13, 2009 11:11 pm

mi consulta es la siguiente: tengo 2 form el form1() que contiene un listbox y un boton. el form2() que contiene un textbox y un boton. el programa debe hacer lo siguiente. cuando hago click en el boton del form1() se abre el form2(), luego cargo los datos en el textbox de este form y hago click en el botón y me tiene que cargar el dato del textbox del form2 en el listbox del form1(). aca va el código:

using System.Text;
using System.Windows.Forms;

namespace Ejemplo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
}
}
}

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 Ejemplo
{

public partial class Form2 : Form
{
Form form1;
public Form2()
{
InitializeComponent();

}

public void button1_Click(object sender, EventArgs e)
{

}

}
}
ciberjuanma
Novato
Novato
 
Mensajes: 12
Registrado: Mar Ene 13, 2009 11:05 pm


Re: eventos entre forms

Notapor gonso » Mié Ene 14, 2009 7:49 am

Se me ocurren dos formas:

La primera (la más fácil de entender)... declara una variable privada de tipo Form1 en tu Form2... cambia el constructor de tu Form2 y añádele un parámetro de tipo Form1, de tal manera que al construir una instancia de Form2 reciba como parámetro una variable Form1 que asignarás a tu variable privada (así, a través de esta variable de tipo Form1, podrás acceder a todos los métodos públicos de Form1 desde tu Form2):

Código: Seleccionar todo
  1. public partial class Form2 : Form

  2.     {

  3.         private Form1 formulario1;

  4.         public Form2(Form1 form)

  5.         {

  6.             formulario1 = form;

  7.             InitializeComponent();

  8.         }

  9.     }



En el código de tu Form1 creas un método público para insertar texto en tu listbox:
Código: Seleccionar todo
  1.  public void InsertarTextoEnLista(string texto)

  2.         {

  3.             listBox1.Items.Add(texto);

  4.         }



Y ahora añades a tu Form2 el evento de click en el botón para pasar el texto de tu text box al list box de tu formulario 1:
Código: Seleccionar todo
  1.  

  2.         private void button1_Click(object sender, EventArgs e)

  3.         {

  4.             formulario1.InsertarTextoEnLista(textBox1.Text);

  5.         }

  6.  



La segunda forma:
Usando eventos y delegados. (Si no sabes lo que son te recomiendo que busques información sobre ellos... son tremendamente útiles en muchas situaciones).
Para ello: declara un delegado fuera de la declaración de las clases pero dentro del namespace de tu proyecto:

Código: Seleccionar todo
  1. namespace PruebaEventosEntreFormularios

  2. {

  3.     public delegate void MessageHandler(string texto);

  4.  

  5.     public partial class Form1 : Form

  6.     {...


Hemos declarado un delegado llamado MessageHandler (que no devolverá nada y que tiene un parámetro de tipo string).

Ahora creamos el evento que se producirá al hacer click en el botón de tu formulario 2, para ello en la clase Form2:
Código: Seleccionar todo
  1. public partial class Form2 : Form

  2.     {

  3.         public event MessageHandler TextoEnviado;

  4.         public Form2()

  5.         {

  6.             InitializeComponent();

  7.         }

  8.  

  9.         private void button1_Click(object sender, EventArgs e)

  10.         {

  11.             TextoEnviado(textBox1.Text);

  12.         }    

  13.     }


Lo que hemos hecho es declarar un evento del tipo MessageHandler (fíjate que el nombre es el mismo que el del delegado creado en form1) y le hemos asignado un nombre de TextoEnviado.
Después respondemos al evento click sobre el botón de este formulario generando el evento recién creado (TextoEnviado) al que le pasamos un parámetro de tipo string que es el contenido del textbox (esto es así porque hemos declarado el delegado que manejará este evento como de tipo void recibiendo un parámetro tipo string).

Pues lo último que nos queda es suscribirnos a dicho evento en el form1... para ello, cuando creas el Form2 como respuesta al click en el botón del formulario 1 debes añadir lo siguiente:
Código: Seleccionar todo
  1. private void button1_Click(object sender, EventArgs e)

  2.         {

  3.             Form2 formulario2 = new Form2();

  4.             formulario2.TextoEnviado += new MessageHandler(InsertarTextoEnLista); //Con esta línea nos suscribimos al evento TextoEnviado del Form2 y lo manejamos con la función InsertarTextoEnLista

  5.             formulario2.ShowDialog();

  6.         }



La función InsertarTextoEnLista (declarada en el Form1) debe cumplir con la forma del delegado, es decir, no debe devolver nada y debe aceptar un parámetro tipo string... aquí te la dejo.
Código: Seleccionar todo
  1. public void InsertarTextoEnLista(string texto)

  2.         {

  3.             listBox1.Items.Add(texto);

  4.         }



Puedes probarlo y verás que las dos formas funcionana.

Espero haberte ayudado.
gonso
Usuario Activo
Usuario Activo
 
Mensajes: 44
Registrado: Dom Nov 05, 2006 4:00 am


Re: eventos entre forms

Notapor gonso » Mié Ene 14, 2009 8:24 am

Por cierto: para que quede claro la primera forma que te he mencionado, cuando creas el Form2 lo debes hacer así:
Código: Seleccionar todo
  1.  

  2. private void button1_Click(object sender, EventArgs e)

  3.         {

  4.             Form2 formulario2 = new Form2(this);// aquí le pasas al formulario2 recién creado una referencia al formulario 1 mediante la palabra reservada "this".

  5.             formulario2.ShowDialog();

  6.         }

gonso
Usuario Activo
Usuario Activo
 
Mensajes: 44
Registrado: Dom Nov 05, 2006 4:00 am

Re: eventos entre forms

Notapor ciberjuanma » Vie Ene 16, 2009 3:36 pm

Amigo, mil gracias por la ayuda. La verdad, no podía haber sido explicado de forma mas concisa y clara. Saludos desde Argentina. :D
ciberjuanma
Novato
Novato
 
Mensajes: 12
Registrado: Mar Ene 13, 2009 11:05 pm


    

Volver a C#

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados