C#-如何使两个表单相互引用
我正在用MS Visual C#编写一个WindowsForms应用程序,需要两个表单才能相互引用。在测试时,我在Form1上创建了两个按钮——一个按钮显示Form2,另一个按钮隐藏它(代码如下) 我想对Form2做同样的事情——创建两个隐藏或显示Form1的按钮。我使用了与Form1相同的方法,但当我编译应用程序时,它似乎陷入了无限循环,我得到了一条StackOverflow消息 如何更改代码,使两个表单能够相互引用 表格1代码:C#-如何使两个表单相互引用,c#,winforms,C#,Winforms,我正在用MS Visual C#编写一个WindowsForms应用程序,需要两个表单才能相互引用。在测试时,我在Form1上创建了两个按钮——一个按钮显示Form2,另一个按钮隐藏它(代码如下) 我想对Form2做同样的事情——创建两个隐藏或显示Form1的按钮。我使用了与Form1相同的方法,但当我编译应用程序时,它似乎陷入了无限循环,我得到了一条StackOverflow消息 如何更改代码,使两个表单能够相互引用 表格1代码: namespace WindowsFormsApplicati
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;
}
}
}
表格2代码:
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;
}
}
}
尽管两者都在相互交谈,但必须首先创建一个并传递给第二个
表格1需要通过Tweek发送到
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;
}
}
}
在frm1对象上创建Form2实例时,此新实例将创建另一个Form1实例,该实例将创建一个新的Form2实例,该实例将 你看到无限循环了吗 在主类上或作为全局应用程序变量创建彼此的一个实例。或者将它们作为参数相互传递。NET framework将只引用它们,而不添加新的内存空间。需要将“其他形式”指定给相应的实例。像这样的事情应该会有帮助
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();
}
在两者之间
您应该命名控件。Form1和Form2构造函数在无限循环中相互调用。感谢您的详细响应。我决定采用第一种选择。
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;
}
}
}