从第二个表单返回到同一实例中的第一个表单

时间:2012-03-07 19:30:27

标签: c#

我有一个由两个winforms和三个类组成的程序,其中一个是静态的。我的第一个表单做了一些工作,并有一个按钮打开第二个表单。当第二个表单打开时,第一个表单将通过此关闭.Visible = false。

我在第二个表单上有一个按钮,我想带我回到第一个表单的同一个实例,以便我可以根据需要输入更多信息。任何新信息都必须添加到原始信息中,以便我可以返回第二种形式。

有办法做到这一点吗?我尝试实例化一个新表单但当然以前的值已经消失了。

以下是我打开第二张表格的第一张表格的代码:

//event handler to call Daily Summary form
    private void btnDailySummary_Click(object sender, EventArgs e)
    {
        DailySummaryForm form2 = new DailySummaryForm(); 
        this.Visible = false;
        form2.Show();            
    }

以下是我的第二个表单重新打开第一个表单的代码:

private void btnRtnToOrderMenu_Click(object sender, EventArgs e)
    {             
        //closes Daily Summary form
        this.Close();
    }

我尝试过“OrderForm.Visibile = true”但当然没有实例化一个不起作用的新实例。我不知所措。

3 个答案:

答案 0 :(得分:0)

创建Form2时,可以在构造函数中传入对Form1的引用。

所以Form2构造函数:

public Form2(Form form1)
{
     //Do stuff with form1, such as store reference to use later
}

然后当你在Form1中创建Form2时,你可以这样做:

Form2 form2 = new Form2(this);

答案 1 :(得分:0)

有很多方法,但这里有一个我喜欢的设计:

private void btnDailySummary_Click(object sender, EventArgs e)
{
    DailySummaryForm form2 = new DailySummaryForm(); 
    this.Visible = false;
    form2.Show();
    form2.Closing += (sender, args) =>
    {
      this.Show();
    }
}

(注意:这都是随便的;可能需要一些小的语法修复来编译)。

这样form2根本不需要了解form1,只知道其他人想要在关闭时运行一些代码。另一方面,Form1能够告诉form2,当你完成时打开我。最常见/最简单的例子是只传递Form1的实例(正如另一个回答者已经提出的那样)但是这会将Form1的所有内容暴露给Form2,允许它做很多你可能不想要的事情。它还增加了两种形式之间的耦合(意味着你不能使用另一种形式)。

答案 2 :(得分:0)

当你回到form1时,Form2是否需要保留旧信息?如果是这样,那么您需要确保在重新打开Form2时,您没有创建新对象。

DailySummaryForm form2;

private void btnDailySummary_Click(object sender, EventArgs e)
{   
    if(form2 == null) //Check for null ...
        form2 = new DailySummaryForm(); //..and create new Form2 if it is null.
    this.Visible = false;
    form2.Show();            
}

这样,当您第一次重新打开Form2后,旧信息仍然存在,然后您只需添加新信息。

此时,最好在Form1中创建某种事件,当它被引发时,会在Form2中发生某些事情(例如更新)。

否则,如果您不需要保留旧信息,请在切换回Form1时自由处理Form2,并使用其他人建议的构造函数将Form1的新版本信息传递给Form2。 / p>