我目前正面临这种情况,我需要你的帮助:
有两个winForms Form 1和Form 2,在form 1上单击按钮的事件将启动form 2。我想启动form 2并关闭(释放)form 1。
有两种方法调用form 2:
1)将阻塞调用与ShowDialog()一起使用;
namespace programm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void callForm2bt_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
this.Close();
}
}
}
在本例中,一旦调用了form 2,我就不能关闭(释放)form 1。
2)通过Show()使用解除阻塞调用;
namespace programm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void callForm2bt_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
this.Close();
}
}
}
在这种情况下,一旦关闭(处理)了form 1,它就会自动处理form 2。
知道如何处理form 1并保持form 2的功能吗?
谢谢
3条答案
按热度按时间piah890a1#
或者执行相反操作:将
Form2
作为主窗体运行,并将其可见性设置为false,然后从该窗体启动Form1
,从Form1
完成后关闭该窗体并将Form2
可见性设置为true。或者使用当前方法但不关闭
Form1
,而是在完成后将其visability设置为false。通过调用this.Hide();
或this.Visable = false;
类似于:**编辑:**在第一个解决方案中,您还可以使用
form1.ShowDialog()
,并避免将Form2
示例传递给Form1
构造函数,因此:hyrbngr72#
从MSDN获取Application.Run(窗体)方法:
“此方法将事件处理程序添加到Closed事件的mainForm参数。该事件处理程序调用ExitThread以清理应用程序。”
http://msdn.microsoft.com/en-us/library/ms157902(VS.90).aspx
基本上,当主窗体退出时,所有消息泵都停止。
我不知道表单在实际应用程序中的作用,但您必须解决这个问题。以下是一些想法--正确的想法可能取决于您正在做什么:
当Form 1关闭时,Form 2将打开。ShowDialog的返回值可用于确定是继续并打开Form 2,还是退出应用程序。
通常在我的应用程序中,Form 1是一种典型的对话框(例如注册表单等),所以第一个行为通常是我所做的。如果对话框被取消,那么我就不运行应用程序。
**编辑:**如果Form 1可以分支为多个其他表单,则可以让它通过字段将要打开的表单返回到Main。例如:
在这一点上,对于Form 1来说,使用更多的按钮来打开其他窗体是微不足道的。主函数不需要关于每个窗体的特殊知识,附加窗体也不需要关于Form 1的特殊知识。
k10s72fa3#
考虑通过
Form1
的构造函数注入Form2
示例,减少了类耦合,增加了灵活性,这样可以安全地处理form1
,并保持form2
的活动