我正在使用MS Visual C#编写WindowsForms应用程序,我需要两种形式才能相互引用。在测试时,我在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;
}
}
}
答案 0 :(得分:5)
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;
}
}
}
答案 1 :(得分:1)
需要将“其他形式”提供给适当的实例。这样的事情会有所帮助。
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();
}
答案 2 :(得分:0)
您在创建其他表单时创建了每个表单的新实例。
相反,您应该使其中一个表单将其父表单的实例作为参数。
答案 3 :(得分:0)
当你在frm1对象上创建Form2的实例时,这个新实例会创建另一个Form1实例,它创建一个新的Form 2实例,...
你看到无限循环吗?
在主类上创建彼此的一个实例或作为全局应用程序变量。或者将它们作为参数传递给对方。 .NET框架只会引用它们而不需要分配新的内存空间。
答案 4 :(得分:0)
答案 5 :(得分:0)
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;
}
}
}