我对C#还是很陌生,所以如果使用错误的术语,我感到抱歉。这是我的问题。我有两种形式。我想要如果我单击Form1中的按钮,它将通过重叠Form1来显示Form2。现在,如果我单击form2中的按钮,我希望form1与form2重叠。但是我总是收到错误“ stackOverFlowException”。为什么会出现错误?怎么解决呢?如果我的问题不清楚,我很抱歉。我希望这些图片可以更好地解释我的问题。 这是form1的代码。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Form2 frm2 = new Form2();
private void Form1_Load(object sender, EventArgs e)
{
frm2.Show();
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
frm2.Left += 10;
if (frm2.Left >= 750)
{
timer1.Stop();
this.TopMost = false;
frm2.TopMost = true;
timer2.Start();
}
}
private void timer2_Tick(object sender, EventArgs e)
{
frm2.Left -= 10;
if (frm2.Left <= 535)
{
timer2.Stop();
}
}
}
}
这是form2的代码
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
Form1 frm1 = new Form1();
private void Form2_Load(object sender, EventArgs e)
{
frm1.Show();
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
frm1.Left += 10;
if (frm1.Left >= 750)
{
timer1.Stop();
this.TopMost = false;
frm1.TopMost = true;
timer2.Start();
}
}
private void timer2_Tick(object sender, EventArgs e)
{
frm1.Left -= 10;
if (frm1.Left <= 535)
{
timer2.Stop();
}
答案 0 :(得分:1)
您正在创建无休止的打开表格链。
首次使用Form1
创建new Form1()
对象时,此表单中的初始化代码
Form2 frm2 = new Form2();
...被调用。依次触发Form2
的初始化代码,
Form1 frm1 = new Form1();
这将创建这种形式的新实例(现在您有两个Form1
实例),并在此新实例中再次调用Form2 frm2 = new Form2();
(现在您有两个Form2
实例)。这一直持续到创建了数千个表单对象并且堆栈溢出为止。
您能做什么?
在Form2
中向构造函数添加一个参数,该参数允许您将引用传递给第一个表单
private readonly Form1 _frm1;
public Form2 (Form1 frm1)
{
InitializeComponent();
_frm1 = frm1;
}
在Form1
中进行
private Form2 _frm2;
private void Form1_Load(object sender, EventArgs e)
(
_frm2 = new Form2(this);
)
即Form2
从不创建Form1
。相反,它获得对已经打开的表单的引用。
您如何将表格放在最前面?
TopMost
属性控制表单打开时的行为。而是使用
_frm1.BringToFront();
随后更改z顺序。