我目前正面临这种情况,我需要你的帮助:
有两个winForms Form1和Form2,form1上的单击按钮事件将启动form2。 我想启动form2并关闭(dispose)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的功能吗?
由于
答案 0 :(得分:1)
要么执行反向操作:将Form2
作为主窗体运行,并将其可见性设置为false,并从中启动Form1
,并从{{ 1}}关闭它并将Form1
可见性设置为true。所以:
Form2
或使用您当前的方法,但不要关闭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();
}
}
,而是在完成后将其可见性设置为false。致电Form1
或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
答案 1 :(得分:0)
从MSDN for Application.Run(Form)方法:
“此方法为Closed事件的mainForm参数添加了一个事件处理程序。事件处理程序调用ExitThread来清理应用程序。”
http://msdn.microsoft.com/en-us/library/ms157902(VS.90).aspx
基本上,当您的主表单退出时,所有消息泵都会停止。
我不知道这些表单在您的实际应用程序中的作用,但您必须解决此问题。一些想法 - 而正确的想法可能取决于你在做什么:
如果Form1是某种对话框,您可以在Application.Run之前调用ShowDialog。例如:
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 fm = new Form1();
fm.ShowDialog();
Application.Run(new Form2());
}
当Form1关闭时,将打开Form2。 ShowDialog的返回值可用于确定是否继续并打开Form2,或退出应用程序。
通常在我的应用程序中,Form1通常是某种对话(例如注册表单等),因此第一种行为通常是我所做的。如果对话框被取消,那么我不会运行该应用程序。
编辑:如果Form1可以分支到多个其他表单,您可以让它返回通过字段打开到Main的表单。例如:
更改Application.Run行,如下所示:
if (fm.FormToOpen != null) Application.Run(fm.FormToOpen);
此时,Form1有更多按钮打开其他表单是微不足道的。主要功能不需要关于每个表单的特殊知识,并且其他表单不需要关于Form1的特殊知识。
答案 2 :(得分:-1)
考虑通过Form2
的构造函数注入Form1
实例,它减少了类耦合并增加了灵活性,这样您就可以安全地处置form1
并保留form2
现场