2012-03-07 82 views
0

我有一个程序由两个winforms和三个类组成,其中一个是静态的。我的第一个表单做了一些工作,并且有一个打开第二个表单的按钮。当第二个窗体打开时,第一个窗体通过this.Visible = false关闭。从第二种形式回到同一实例中的第一种形式

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

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

这是我的第一个形式打开第二个代码:做“OrderForm

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

我想:

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

这里是我的第二个形式重新打开第一个代码。 Visibile = true“,但当然没有实例化一个不起作用的新实例。我很茫然。

回答

0

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

所以Form2的构造函数:

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

然后当你在Form1中创建窗体2,你可以这样做:

Form2 form2 = new Form2(this); 
+0

我做了适当的修改,但也许我一直在盯着我的显示器太长,因为我仍然感到困惑。当我按下表单2的按钮关闭时,程序将转到事件处理程序,而不是构造函数。如果我向构造函数中添加“this.Visibility = true”,如何让事件处理程序跳到那里并执行语句? – 2012-03-07 19:59:49

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,从而允许它做很多你可能不想要的事情。它也增加了两种形式之间的耦合(意味着你不能使用另一种形式)。

+0

你可以解释一下form2.Closing + =(sender,arggs)=>。我不确定那里发生了什么。我从未见过=>以前。这是做什么的? – 2012-03-07 20:01:16

+0

@ProgrammingNewbie它附加了一个事件处理程序。表格有很多活动,其中一个是“闭幕”。这意味着,“执行我将在”Closing“时提供的方法,其余部分只是在自治函数中调用'this.Show()',以便签名正确。事件需要被赋予一个带有两个参数的方法,sender和EventArguments;我们不需要它们,但是我们仍然需要它们以便编译所有内容。还有其他更强大的synaxes用于将处理程序附加到事件如果你喜欢它们, – Servy 2012-03-07 20:22:28

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

这样,当你在第一时间之后重新打开窗体2,旧的信息将仍然存在,然后你可以简单地添加新的信息。

在这一点上,最好在Form1中创建某种事件,当这种事件发生时,会导致Form2中发生某些事情(如更新)。否则,如果您不需要保留旧信息,则可以随意在切换回Form1时处理Form2,并使用其他人建议的构造函数将新版本的信息从Form1传递到Form2。

+0

不,表单2中显示的信息是从表单1中的信息派生的,所以表单1中的任何更改都会使表单2的这个实例无用,所以我打算使用this.Close()关闭表单2全部 – 2012-03-07 20:02:33

+0

那么你究竟想要在两种表单之间做什么,因为如果Form2被保存了,这并不重要?你是否希望Form2传递它改回Form1的信息? – 2012-03-07 20:10:38

+0

不,表单2从其获取信息form1。我只是在我必须输入更多信息的情况下,要回到form1的同一个实例。如果我再次需要form2,我将重新单击form1上的按钮,并且会生成一个包含更新信息的新窗体。 – 2012-03-07 20:16:26

相关问题