我有一个由两个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”但当然没有实例化一个不起作用的新实例。我不知所措。
答案 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>