在同样的情况下,从二年级回到一年级

本文关键字:二年级 一年级 情况下 | 更新日期: 2023-09-27 18:27:00

我有一个程序,它由两个winform和三个类组成,其中一个是静态的。我的第一个表单做了一些工作,并有一个打开第二个表单的按钮。当第二个窗体打开时,第一个窗体通过此关闭。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.Visibilie=true",但当然没有实例化一个不起作用的新实例。我不知所措。

在同样的情况下,从二年级回到一年级

创建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);

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

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,允许它做很多你可能不想做的事情。它还增加了两种形式之间的耦合(这意味着你不能在没有另一种的情况下使用其中一种)。

Form2在返回form1时是否需要保留旧信息?如果是这样,则需要确保在重新打开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。