C # – Cómo hacer que dos formularios se refieran entre sí

Estoy escribiendo una aplicación de WindowsForms en MS Visual C #, y necesito dos formularios para poder hacer referencia entre sí. Cuando realizo la prueba, creé dos botones en Form1: un botón que muestra Form2 y otro botón que lo oculta (el código está debajo).

Quiero hacer lo mismo para Form2: crea dos botones que oculten o muestren Form1. Usé el mismo método que utilicé para Form1, pero cuando compilo la aplicación, parece quedar atrapada en un ciclo infinito y obtengo un mensaje de StackOverflow.

¿Cómo puedo cambiar el código para que ambos formularios puedan hacer referencia el uno al otro?

Código Form1:

namespace WindowsFormsApplication1 { public partial class Form1 : Form { Form2 frm2; public Form1() { InitializeComponent(); frm2 = new Form2(); } private void button1_Click(object sender, EventArgs e) { frm2.Visible = false; } private void button2_Click(object sender, EventArgs e) { frm2.Visible = true; } } } 

Código de Form2:

 namespace WindowsFormsApplication1 { public partial class Form2 : Form { Form1 frm1; public Form2() { InitializeComponent(); frm1 = new Form1(); } private void button1_Click(object sender, EventArgs e) { frm1.Visible = false; } private void button2_Click(object sender, EventArgs e) { frm1.Visible = true; } } } 

El código de Forms2 debe ser

 namespace WindowsFormsApplication1 { public partial class Form2 : Form { Form1 frm1; public Form2(Form1 parent) { InitializeComponent(); frm1 = parent; } private void button1_Click(object sender, EventArgs e) { frm1.Visible = false; } private void button2_Click(object sender, EventArgs e) { frm1.Visible = true; } } } 

Aunque ambos se hablan entre sí, uno debe crearse primero y pasar al segundo.

Form1 necesitará ser modificado para

 public Form1() { InitializeComponent(); frm2 = new Form2(this); } 

La otra forma de hacerlo es crear ambos y pasarlo después de la construcción

 namespace WindowsFormsApplication1 { public class SomewhereElse { public void SomeFunction() { Form1 form1= new Form1(); Form2 form2= new Form2(); form1.frm2 = form2; form2.frm1 = form1; } } public partial class Form2 : Form { public Form1 frm1 {get; set;} public Form2(Form1 parent) { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { frm1.Visible = false; } private void button2_Click(object sender, EventArgs e) { frm1.Visible = true; } } public partial class Form1 : Form { public Form2 frm2 {get; set;} public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { frm2.Visible = false; } private void button2_Click(object sender, EventArgs e) { frm2.Visible = true; } } } 

La “Otra forma” debe darse a la instancia apropiada. Algo como esto debería ayudar.

 public partial class TogglingForm : Form { TogglingForm Other {get; set;} public TogglingForm() { InitializeComponent(); } private void HideOther_Click(object sender, EventArgs e) { Other.Visible = false; } private void ShowOther_Click(object sender, EventArgs e) { Other.Visible = true; } } .... static void Main() { var first = new TogglingForm(); var second = new TogglingForm {Other = first}; first.Other = second; first.Show(); } 

Está creando una nueva instancia de cada formulario a medida que crea la otra forma.

En su lugar, debe hacer que una de las formas tome una instancia como su forma principal como parámetro.

Cuando crea una instancia de Form2 en el objeto frm1, esta nueva instancia crea otra instancia de Form1, que crea una nueva instancia de Formulario 2, que …

¿Ves el ciclo infinito?

Cree una instancia el uno del otro en la clase principal o como variables de aplicación globales. O páselos como parámetro el uno al otro. El framework .NET simplemente hará referencia a ellos sin tener que ubicar nuevo espacio de memoria.

 namespace WindowsFormsApplication1 { public partial class Form2 : Form { Form1 frm1; public Form2(Form1 frm1) { InitializeComponent(); this.frm1 = frm1; } private void button1_Click(object sender, EventArgs e) { frm1.Visible = false; } private void button2_Click(object sender, EventArgs e) { frm1.Visible = true; } } } 

Tener un mediador (definición de Wikipedia) entre los dos.

Este es un ejemplo de implementación en C #.