Pasar un valor de una forma a otra

Tengo dos formularios llamados form1 y form2 :

  • form1 está hecho de una label y un button .
  • form2 está hecho de un textBox y un button

Cuando hago clic en el botón form1 , esto aparecerá en form2 . Cualquier entrada en textBox debe escribirse nuevamente en form1.label una vez que form1.label el botón en form2 .
Tengo el código a continuación, pero no funciona.

 // Code from Form 1 public partial class Form1 : Form { public void PassValue(string strValue) { label1.Text = strValue; } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 objForm2 = new Form2(); objForm2.Show(); } } // Code From Form 2 public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form1 objForm1 = new Form1(); objForm1.PassValue(textBox1.Text); this.Close(); } } 

Y una captura de pantalla:

Captura de pantalla de la aplicación

¿Cómo puedo darme cuenta de eso?

No tiene acceso a su formulario1, desde el cual creó form2. En form2 button1_Haga clic en Crear nueva instancia de Form1, que no es lo mismo que initial. Puede pasar su instancia de form1 al constructor de form2 así:

  // Code from Form 1 public partial class Form1 : Form { public void PassValue(string strValue) { label1.Text = strValue; } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 objForm2 = new Form2(this); objForm2.Show(); } } // Code From Form 2 public partial class Form2 : Form { Form1 ownerForm = null; public Form2(Form1 ownerForm) { InitializeComponent(); this.ownerForm = ownerForm; } private void button1_Click(object sender, EventArgs e) { this.ownerForm.PassValue(textBox1.Text); this.Close(); } } 

Como se menciona en otras publicaciones, no podrá hacer referencia al Form1 original creando una nueva instancia de Form1. Puede pasar Form1 en el constructor de Form2 o exponer el texto de Form2 como una propiedad pública, pero generalmente prefiero usar delegates para mantener el acoplamiento flexible.

 // Code from Form 1 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 objForm2 = new Form2(); objForm2.PassValue += new PassValueHandler(objForm2_PassValue); objForm2.Show(); } public void objForm2_PassValue(string strValue) { label1.Text = strValue; } } // Code From Form 2 public delegate void PassValueHandler(string strValue); public partial class Form2 : Form { public event PassValueHandler PassValue; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (PassValue != null) { PassValue(textBox1.Text); } this.Close(); } } 

Cuando estás haciendo:

 Form1 objForm1 = new Form1(); objForm1.PassValue(textBox1.Text); 

… está creando un nuevo Form1 y llamando al método PassValue en el objeto Form1 incorrecto. En cambio, podrías hacer:

 public partial class Form1 : Form { // This is the text that will be entered in form2 public String form2text; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Show form2 Form2 objForm2 = new Form2(this); objForm2.ShowDialog(); // When form2 is closed, update the label text on form1 label1.Text = form2text; } } public partial class Form2 : Form { // This is the instance of Form1 that called form2 private Form1 form1caller; public Form2(Form1 form1caller) { InitializeComponent(); this.form1caller = form1caller; } private void button1_Click(object sender, EventArgs e) { // Pass the textBox value to form1 before closing form2 form1caller.form2text = textBox1.Text; this.Close(); } } 

Acabo de probar este código y funciona, seguro que te ayudará.

en la primera forma (Formulario1) escriba a continuación:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 f = new Form2(textBox1.Text); f.ShowDialog(); } } 

en la segunda forma ( Form2 ) use los códigos a continuación:

 public partial class Form2 : Form { public Form2( string st) { InitializeComponent(); textBox1.Text = st; } private void Form2_Load(object sender, EventArgs e) { } } 

Podrías hacer esto:

 class Form2 { public string ReturnedText = ""; private void button1_Click(object sender, EventArgs e) { ReturnedText = textbox1.Text; Close(); } } 

y en form1

 Form2 objForm2 = new Form2(); objForm2.ShowDialog(); string ret = objForm2.ReturnedText; 

Debería pasar la referencia en form1 a form2 en lugar de crear una nueva instancia en este código:

 private void button1_Click(object sender, EventArgs e) { Form1 objForm1 = new Form1(); // ← this is another form1, not that you see objForm1.PassValue(textBox1.Text); this.Close(); } 

La forma en que normalmente me acerco a este requisito es la siguiente:

Pongo una propiedad pública en la clase de Form2:

 public string ValueFromForm1 { get; set; } //In the constructor, or other relevant method, I use the value public Form2() { form2LabelToDisplayForm1Value.Text = ValueFromForm1; } 

Para devolver algo a Form1, debe agregar una propiedad pública a la clase Form1 para recibir el valor, y luego enviar una referencia al formulario a Form2, de modo que Form2 pueda establecer el valor:

 //Add reference property to Form2 class public Form1 CallingForm { get; set; } //Form2 can access the value on Form1 as follows: private someMethod() { this.CallingForm.ValueFromForm2 = "Info coming from form 2"; } 

entonces

 //Add public property to Form1 class public string ValueFromForm2 { get; set; } //When Form2 is created, set the reference property Form2 objForm2 = new Form2(); objForm2.CallingForm = this; objForm2.Show(); 

Como Form2 ahora tiene una referencia al Formulario 1 que creó, no hay necesidad de llamar a Form1 () nuevo en ninguna parte en Form2. Todo lo que tiene que hacer Form2 es establecer el valor en la referencia y luego cerrarlo.

Esto es lo que vas a hacer:

 // Code from Form 1 public partial class Form1 : Form { public string MyValue { get; set; } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 objForm2 = new Form2(); objForm2.textBox1.Text = MyValue; objForm2.MainForm = this; objForm2.Show(); } } // Code From Form 2 public partial class Form2 : Form { public Form1 MainForm { get; set; } public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MainForm.MyValue = textBox1.Text; MainForm.Show(); this.Close(); } } 

Formulario 1 código …: –

 namespace Passing_values_from_one_form_to_other { public partial class Form1 : Form { string str; private String value1;//taking values from form no _of_test_cases public string value { get { return value1; } set { value1 = value; } } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { textBox1.Text = str; } private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.ShowDialog(); str = f2.passvalue; } } } 

Código de forma 2 ….: –

 namespace Passing_values_from_one_form_to_other { public partial class Form2 : Form { private string str; public string passvalue { get { return str; } set { str = value; } } public Form2() { InitializeComponent(); } private void Btn_Ok1_Click(object sender, EventArgs e) { passvalue = textBox1.Text; this.Close(); } } } 

ejecutarlo directamente obtendrá la imagen clara … de la misma manera que puede pasar valores de una forma a otra …

publique sus comentarios si enfrenta algún problema …

Espero que esto ayude …

o bien, puedes referir este video …

http://www.youtube.com/watch?v=PI3ad-TebP0