C# – 如何使两个表单相互引用

我在MS Visual C#中编写了一个WindowsForms应用程序,我需要两种forms才能相互引用。 在我测试时,我在Form1上创建了两个按钮 – 一个按钮显示Form2,另一个按钮隐藏它(代码在下面)。

我想对Form2做同样的事情 – 创建隐藏或显示Form1的两个按钮。 我使用了与Form1相同的方法,但是当我编译应用程序时,似乎陷入无限循环并且我收到了StackOverflow消息。

如何更改代码以使两个表单能够互相引用?

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; } } } 

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; } } } 

Forms2的代码应该是

 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; } } } 

即使两者互相交谈,也必须首先创建一个并传递给第二个。

Form1需要进行调整

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

另一种方法是创建两个并在构造后传递它

 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; } } } 

需要将“其他forms”赋予适当的实例。 这样的事情应该会有所帮助。

 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(); } 

您在创建另一个表单时创建了每个表单的新实例。

相反,您应该使其中一个表单将其父表单的实例作为参数。

当您在frm1对象上创建Form2的实例时,此新实例将创建另一个Form1实例,该实例将创建一个新的Form 2实例,该实例…

你看到无限循环吗?

在主类上创建彼此的一个实例或作为全局应用程序变量。 或者将它们作为参数传递给对方。 .NET框架只会引用它们而不需要分配新的内存空间。

 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; } } } 

在两者之间有一个调解员(维基百科定义) 。

这是C#中的一个实现示例。