打开表单时堆栈溢出

时间:2018-12-08 16:18:35

标签: c#

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

1 个答案:

答案 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顺序。