• Domingo 22 de Diciembre de 2024, 14:29

Autor Tema:  eventos entre forms  (Leído 3416 veces)

ciberjuanma

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
eventos entre forms
« en: Jueves 8 de Enero de 2009, 08:54 »
0
hola, mi problema es el siguiente. tengo dos forms. en el form1 tengo un textbox y un botón. en el form2 tengo un listbox. mi duda es: como hago para generar un evento en el boton del form1 que me cargue lo que ingrese en el textbox, en el listbox del form2. no se como hacer un evento que me modifique datos en otra ventana. a quien me pueda ayudar se lo agradeceria muchisimo.

psikotic

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: eventos entre forms
« Respuesta #1 en: Domingo 11 de Enero de 2009, 00:25 »
0
La forma mas recomedada es a traves de una propiedad publica en el Form2, que actualizas en el evento del boton del Form1. Pero para hacerlo exactamente como dices puedes intentar lo siguiente:

Código: Text
  1. static void Main()
  2.         {            
  3.             Application.EnableVisualStyles();
  4.             Application.SetCompatibleTextRenderingDefault(false);            
  5.  
  6.             // creas los Forms que necesitas para el intercambio de información
  7.             Form1 mF1 = new Form1();
  8.             Form2 mF2 = new Form2();
  9.            
  10.             // codigo para manejar el evento click del boton en el Form1
  11.             mF1.btnSend.Click += new EventHandler(delegate (object sender, EventArgs e)
  12.                                                       {
  13.                                                           // accedes a los miembros que deseas modificar del Form2
  14.                                                           mF2.lstData.Items.Add(mF1.txtData.Text);                                                          
  15.                                                           // mostrar el Form2, si es que no esta visible
  16.                                                           mF2.Visible = true;
  17.                                                       });
  18.             // Inicias la aplicación
  19.             Application.Run(mF1);
  20.         }
  21.  

debes poner el listbox, textbox y el button como publicos, de ahi la recomendación de hacerlo mejor con propiedades y mantener la encapsulación

ciberjuanma

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Nueva Consulta: eventos entre forms
« Respuesta #2 en: Martes 13 de Enero de 2009, 07:52 »
0
ok, te agradezco muchisimo la respuesta, mi problema es el siguiente: Mi form1() esta activo en pantalla, o sea es un formulario padre y contiene un boton y un listbox. hago click en el botón btnCargar de este form1() y se me abre el form2() que contiene un textbox para cargar un dato y un boton que genera el Evento para cargar ese dato en un ListBox del form1(). aca va el código:

using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

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


using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {

        }
    }
}
Desde ya, muy agradecido por tu tiempo. ojalá algún día pueda saber tanto el lenguaje como para enseñar a otro programador inexperto como yo.

E.Baley

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Re: eventos entre forms
« Respuesta #3 en: Martes 13 de Enero de 2009, 12:11 »
0
al crear el Form2 pásale una referencia del Form principal
Sería:

Código: Text
  1.  
  2. private void btnCargar_Click(object sender, EventArgs e) {
  3.     Form2 form2 = new Form2(this);
  4.     form2.ShowDialog();
  5. }
  6.  
  7.  

El Form2, en el constructor, haz que guarde esa referencia en una variable para poder dirigirse a ella en lo sucesivo.

sl2

ciberjuanma

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Consulta: eventos entre forms
« Respuesta #4 en: Miércoles 14 de Enero de 2009, 02:54 »
0
te agradezco la respuesta. pero probé y no puedo acceder a los miembros de form1() desde form2() de esa manera, o me gustaria que me muestres el código si podés. sé que no es dificil pero busco por todos lados y no puedo encontrar como generar eventos de este tipo, que modifiquen o ingresen datos desde un form a otro form que esta visible.

E.Baley

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Re: eventos entre forms
« Respuesta #5 en: Viernes 16 de Enero de 2009, 09:30 »
0
Veamos
--> El Form1 es el form principal

Código: Text
  1.  
  2. namespace Ejemplo {
  3.     public partial class Form1 : Form {
  4.  
  5.         public Form1() {
  6.             InitializeComponent();
  7.         }
  8.  
  9.         // Este es el método que crea el form hijo
  10.         private void btnCargar_Click(object sender, EventArgs e) {
  11.             Form2 form2 = new Form2(this);    // --> Así le pasas una referencia al hijo de este form (el principal), para que pueda invocar sus métodos
  12.             form2.ShowDialog();
  13.         }
  14.  
  15.         // Este es el método que se invocará desde el form hijo
  16.         public void HOLA(){
  17.             System.Diagnostics.Debug.WriteLine("Hola desde el form hijo");
  18.         }
  19.  
  20.     }
  21. }
  22.  

--> El Form2 es el hijo

Código: Text
  1.  
  2. namespace Ejemplo {
  3.     public partial class Form2 : Form {
  4.  
  5.     Form _formPrincipal;    // --> Aquí se guardará la referencia del Form principal que viene en el constructor al instanciar una clase de este objeto
  6.  
  7.     public Form2(Form fp){
  8.         _formPrincipal = fp;    // --> Aquí guardamos efectivamente esa referencia
  9.         InitializeComponent();
  10.     }
  11.  
  12.     private void button1_Click(object sender, EventArgs e){
  13.         // Ahora ya podemos usar los métodos del Form principal
  14.         _formprincipal.HOLA();
  15.     }
  16.  
  17. }
  18. }
  19.  

E.Baley

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Re: eventos entre forms
« Respuesta #6 en: Viernes 16 de Enero de 2009, 09:41 »
0
Acabo de releer la pregunta y veo que la he respondido al revés. Lo que te he respondido sirve para invocar un método del form principal desde el hijo.
de todas formas, para hacerlo al revés verás que es muy fácil, y el sistema es el mismo.
Ahora lo que debes hacer es guardar una referencia del form hijo en el principal, e invocar sus métodos de la misma forma.
por ejemplo, te creas una variable :
Form _formHijo;

y asignas su contenido en el momento de crear el hijo:
_formHijo = new Form2(this);
_formHijo.ShowDialog();

Ahora ya la tienes guardada y puedes hacer, desde otro botón:
_formHijo.RellenaListBox(miTextBox.Text);

y el hijo debe recoger ese dato en el método RellenaListBox(string elTexto) y añadirlo al ListBox correspondiente.

saludos

ciberjuanma

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: eventos entre forms
« Respuesta #7 en: Viernes 16 de Enero de 2009, 19:54 »
0
Muchisimas gracias por la ayuda. en mi programa debía hacer click en el botón del form1 y se abria el form2 luego debía ingresar un texto en el form2 y presionar el boton, y luego se cargaba el contenido del textbox en el listbox del form1. aca va el código.

using System.IO;
using System.Windows.Forms;


namespace Eventos
{
   
    public partial class Form1 : Form
    {

       
        public Form1()
        {
            InitializeComponent();
        }
        private void lnkInsertar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Form2 form2 = new Form2(this);//creo el form2 y le paso el form1 como parametro al constructor
            form2.ShowDialog();

        }

using System.Windows.Forms;

namespace Eventos
{
    public partial class Form2 : Form
    {
        private Form1 form1;//creo la variable de tipo form1 para utilizarla para acceder a las propiedades del form1
        public Form2()
        {
            InitializeComponent();
        }

        public Form2(Form1 form)
        {
            InitializeComponent();
            form1 = form;              //cargo la variable form1 con el form que le pase como parametro al constructor para poder acceder a las propiedades de form1
        }
        private void lnkInsertar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (txtboxNombre.Text != "")
            {
                    //verifica si el elemento ingresado en el textbox1 del form2() no se encuentra en el listbox del form1()
                    if (!((ListBox)form1.Controls["lstbxNombres"]).Items.Contains(txtboxNombre.Text)) //con ((tipocontrol)form1.Controls["nombrecontrol"]).TipoMetodo logro acceder a los metodos del control "nombre control" del form1
                    {
                        if (((ListBox)form1.Controls["lstbxNombres"]).Items.Count == 0)
                            ((ListBox)form1.Controls["lstbxNombres"]).Items.Insert(0, txtboxNombre.Text);
                        else
                            ((ListBox)form1.Controls["lstbxNombres"]).Items.Add(txtboxNombre.Text);
                    }
                    else
                        MessageBox.Show("El contacto ya existe en la lista", "Error al cargar contacto", MessageBoxButtons.OK, MessageBoxIcon.Error);
               
            }
            }


        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            this.Close();
        }
 

    }
}

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: eventos entre forms
« Respuesta #8 en: Sábado 17 de Enero de 2009, 04:41 »
0
Es mas recomendable hacerlo con eventos delegate.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

ciberjuanma

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: eventos entre forms
« Respuesta #9 en: Domingo 18 de Enero de 2009, 19:42 »
0
Acá esta el mismo código pero hecho con eventos y delegados. Mil gracias por su ayuda.

using System;
using System.Windows.Forms;

namespace EventosFormsDelegados
{
    public delegate void Handler(string texto);
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.TextoEnviado += new Handler(InsertarTextoEnLista);
            form2.ShowDialog();
        }
        public void InsertarTextoEnLista(string texto)
        {
            if (!EstaEnLista(texto))
                listBox1.Items.Add(texto);
            else
                MessageBox.Show("El Contacto ya esta en la lista", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        private bool EstaEnLista(string texto)
        {
            if (listBox1.Items.Contains(texto))
                return true;
            else
                return false;
        }
    }
}

using System;
using System.Windows.Forms;

namespace EventosFormsDelegados
{
    public partial class Form2 : Form
    {
        public event Handler TextoEnviado;
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            TextoEnviado(textBox1.Text);
        }
    }
}