Ayuda C#, problema con win forms

Iniciado por CrÄsH, 11 Enero 2009, 01:36 AM

0 Miembros y 1 Visitante están viendo este tema.

CrÄsH

Hola, aver si consigo explicarme bien;

tengo dos formularios en un mismo proyecto, el principal i el secundario, y quiero pasa datos del secundario al principal, para pasar datos del principal al secundario he hecho lo siguiente:

He puesto esto en un boton del form principal:
     Form f = new FormSecundario(datos);
     f.show();
I en el form secundario:
   public FormSecundario(tipo datos);

Hasta aki funciona, pero intento hacer lo mismo intentado pasar datos del secundario al principal:
He puesto esto en un boton del form secundario:
     Form f = new FormPrincipal(datos);

I en el form principal:
   public FormPrincipal(tipo datos);

y me sale un error:

'Proyecto.FormPrincipal' no contiene un constructor que tome argumentos '0'   

i al pulsarlo me envia al Program.cs(por defecto), es decir, al main(), y conecretamente me marca:

    Application.Run(new FormPrincipal());

Como lo puedo hacer para poderlo hacer igual k del principal al secundario??

Gracias!!




~~~~~~~~~~~~~~~~

Mace Windu

¿Has oído hablar del patrón Singleton? Puede qué eso de solución a tu problema ;).

http://es.wikipedia.org/wiki/Singleton

Salu2

CrÄsH

Mace Windu : gracias por tu respuesta pero no llego a tanto y me e kedado igual.
~~~~~~~~~~~~~~~~

Mace Windu

#3
Bien, déjame un rato que cree un pequeño código para que te sirva de ejemplo y lo publico :).

Edit:

Tal cómo te prometí, aquí lo tienes. He simplificado la tarea, mediante la creación de una variable pública. Cada formulario tiene un botón y un cuadro de textol. Espero que era esto lo que intentabas hacer

Form1
Código (csharp) [Seleccionar]
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public static string Titulo;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Titulo = textBox1.Text;
            Form2 frmForm2 = new Form2();
            frmForm2.Show();
        }

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            this.Text = Titulo;
        }
    }
}


Form2
Código (csharp) [Seleccionar]
using System;
using System.Windows.Forms;

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

        private void Form2_Load(object sender, EventArgs e)
        {
            this.Text = WindowsFormsApplication1.Form1.Titulo;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WindowsFormsApplication1.Form1.Titulo = textBox1.Text;
            this.Close();
        }
    }
}


Salu2

CrÄsH

Gracias, una duda, Form1_DoubleClick que es? pq lo k me pasa es k nc donde poner el this.Text = Titulo; (en el caso de este codigo), pq kuando se cierra el Form2 como lo hago para k lea el this.Text = Titulo; en el Form1.

~~~~~~~~~~~~~~~~

BETA_V

#5
Hola ¡¡¡ lo que podes hacer es esto¡¡

en la declaracion del form2

Código (csharp) [Seleccionar]

        Form1 frm;
        public Form2()
        {
            InitializeComponent();
        }


//Definimos otro constructor
        public Form2(Form1 frm1)
        {
            frm = new Form1();
            frm = frm1;
            InitializeComponent();          
        }

//ahora que tenemos instanciado el form1,podemos acceder a sus propiedades y //metodos


y cuando llamemos al form2 desde el form1 lo hacemos de esta manera

Código (csharp) [Seleccionar]

           //el this seria el form1
            Form2 f = new Form2(this);
            f.Show();


espero que te haya sido de ayuda

CrÄsH

Lo k necesito es k al pulsar un boton del Form2  me cree un ListBox en el Form1, con valores del Form2.
~~~~~~~~~~~~~~~~

BETA_V

de la manera que te indique yo lo podes hacer ;D¡¡¡ podes acceder a los controles ,metodos .... del form1

lo unico que me olvide.es que tener que cambiar el modificador de acceso, del control en cuestion,en el form 1,precisamente en  Nombre_de_archivo_donde_tenes_el_control.Designer.cs

por ej:

Código (csharp) [Seleccionar]

  private System.Windows.Forms.Label label1;
  //lo hacemos publico
  public System.Windows.Forms.Label label1;

y ahi podemos acceder al control del form1 desde el form2.

un ejemplo sencillo, cambiamos el contenido del label del form1, desde el form2

Código (csharp) [Seleccionar]

private void button1_Click(object sender, EventArgs e)
        {
            frm.label1.Text="hola";
        }

CrÄsH

#8
Gracias BETA_V , pero no lo acabo de entender tu ejemplo, o mejor dicho, no se como aplicarlo al problema k tengo, con el ejemplo k me muestras.

El ejemplo de Mace Windu lo entenia mejor, lo unico k me faltaba era saber como hacerlo para k al cerrar el Form2, pues en el Form1 me leiera esto this.Text = Titulo;(en el caso de su codigo), sin tener k pulsar nada. ya k tengo k conseguir k despues de cerrar el Form2 mediante un boton, pues en el Form1 se me cree un listbox, lleno de los datos(tabla de strings) del Form2;

Gracias

~~~~~~~~~~~~~~~~

BETA_V

#9
hola que tal¡¡¡¡
te paso el codigo,entero para que veas como queda¡¡¡

este seria el codigo del form1 en donde esta el listbox
Código (csharp) [Seleccionar]

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

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2(this);
            f.Show();
        }
    }


ahora cambiamos la visibilidad del list box y lo ponemos como publico,ya que al ser privado no podremos acceder a el desde el form2,esta modificacion seria en el archivo Form1.Designer.cs

Código (csharp) [Seleccionar]


        #region Windows Form Designer generated code

        ///
        #endregion
        //al list box lo ponemos como publico
        public System.Windows.Forms.ListBox listBox1;
        private System.Windows.Forms.Button button1;


y la parte final el codigo del form2

Código (csharp) [Seleccionar]

    public partial class Form2 : Form
    {
        Form1 frm;
        public Form2()
        {
            InitializeComponent();
        }

        public Form2(Form1 frm1)
        {
            frm = new Form1();
            frm = frm1;
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
//agregamos datos en el listbox del form1
            frm.listBox1.Items.Add("hola");
            frm.listBox1.Items.Add("que");
            frm.listBox1.Items.Add("tal");
            Close();

        }
    }


espero que te sea de ayuda ,cualquier duda pregunta,para eso esta el foro.