我目前正面临着这种情况,我需要你的帮助:
有两个winForms Form1和Form2,form1上的单击按钮事件将启动form2。我想启动form2并关闭(处置) form1。
我有两种调用Form2的方法:
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();
}
}
}在这种情况下,一旦调用了form2,我就不能关闭(处置) form1。
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();
}
}
}在这种情况下,一旦form1被关闭(释放),它将自动释放form2。
你知道如何处理form1并保持form2的功能吗?
谢谢
发布于 2011-07-26 23:23:00
或者执行相反的操作:将Form2作为主窗体运行,并将其可见性设置为false,然后从该窗体启动Form1,当从Form1完成时,关闭它并将Form2可见性设置为true。所以:
static void Main()
{
...
Application.Run(new Form2());//instead of Form1
}
public class Form2 ...
{
//At From2.Load:
private void Form2_Load(object sender, EventArgs e)
{
this.Hide();//the form2 will hide and show the form 1.
Form1 form1 = new Form1(this);
form1.Show();
}
}
public class Form1...
{
private Form2 _form2 = null;
public Form1()
{ InitializeComponents();}
public Form1(Form2 form2) : this()
{
_form2 = form2;
}
private void callForm2bt_Click(object sender, EventArgs e)
{
if (_form2 != null)
{
_form2.Show();
}
this.Close();
}
}或使用您当前的方法,但不要关闭Form1,而是在完成后将其可见性设置为false。通过像这样调用this.Hide();或this.Visable = false;:
private void callForm2bt_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
this.Hide();//this will hide the control from the user but it will still alive.
}编辑:在第一个解决方案中,您还可以使用form1.ShowDialog(),并避免将Form2实例传递给Form1构造函数,因此:
//At From2.Load:
private void Form2_Load(object sender, EventArgs e)
{
this.Hide();//the form2 will hide and show the form 1.
Form1 form1 = new Form1();
form1.ShowDialog();
this.Show();//the form1 is closed so just show this again.
}发布于 2011-07-26 23:33:22
从MSDN for Application.Run(Form)方法:
“此方法向Closed事件的mainForm参数添加事件处理程序。事件处理程序调用ExitThread以清除应用程序。”
http://msdn.microsoft.com/en-us/library/ms157902(VS.90).aspx
基本上,当您的主窗体退出时,所有消息泵都会停止。
我不知道表单在您的实际应用程序中做了什么,但是您必须解决这个问题。一些想法--正确的想法可能取决于你在做什么:
static void Main() { Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Form1 fm =新Form1();fm.ShowDialog();Application.Run(新Form2());}
当Form1关闭时,Form2将被打开。可以使用ShowDialog的返回值来确定是否继续并打开Form2,或者退出application.
通常在我的应用程序中,Form1通常是某种类型的对话框(例如注册表等)。所以第一个行为通常就是我所做的。如果对话框被取消,我就不会运行应用程序。
编辑:如果Form1可以分支到许多其他表单,您可以让它返回表单,以便通过字段打开到Main。例如:
if (fm.FormToOpen != null) Application.Run(fm.FormToOpen);
在这一点上,对于Form1来说,拥有更多用于打开其他表单的按钮将是微不足道的。main函数不需要每个表单的专门知识,其他表单也不需要Form1的专门知识。
发布于 2011-07-26 23:20:16
考虑通过Form1的构造函数注入Form2实例,减少了类的耦合,增加了灵活性,这样就可以安全地部署form1,保持form2的活性
https://stackoverflow.com/questions/6832382
复制相似问题