如何从Windows Forms 2.0中的子窗体关闭父窗体?
当您在WinForms中关闭表单时,它会处理它的所有子项。所以这不是一个好主意。您需要异步执行此操作,例如,您可以向父窗体发送消息。
Form类没有提供对“父”表单的任何引用,所以没有直接访问父表的方法(除非碰巧也是MDI父表,在这种情况下,您可以访问它通过MDIParent属性)。您必须在子构造函数或属性中传递对父项的引用,然后记住设置它,然后使用该引用强制父项关闭。
也许考虑让父母订阅一个关于孩子的事件,并且孩子只要想关闭父母就可以触发该事件。父母可以处理它自己的关闭(和孩子一起)。
你很明显是使用正确的方式打开和关闭窗体。如果您使用任何形式的MVC或MVP,则不会出现此问题。
所以使用MVP或MVC的形式来解决这个问题。
我同意davidg;您可以添加到父窗体的子窗体的构造函数的引用,然后关闭父窗体,因为你需要:
private Form pForm;
public ChildForm(ref Form parentForm)
{
pForm = parentForm;
}
private closeParent()
{
if (this.pForm != null)
this.pForm.Close();
this.pForm = null;
}
我有同样的问题,这种解决方案不适用于我的情况。 也在第二个表格我开始一个线程,这是否造成问题。 – Posto 2009-11-05 13:51:28
我碰到这个博客条目,看起来像它会工作运行和它使用的事件处理程序从D2VIANT概念答案
http://www.dotnetcurry.com/ShowArticle.aspx?ID=125
摘要: 第1步:创建一个新的Windows应用程序。打开Visual Studio 2005或2008.转到文件>新建>项目>在“项目类型”> Windows应用程序中选择Visual Basic或Visual C#。给项目一个名称和位置>确定。
步骤2:在项目中添加一个新的 表格。右键单击项目>添加> Windows窗体> Form2.cs>添加。
第3步:现在在Form1中,拖放一个按钮'btnOpenForm'并双击它以生成事件处理程序。在其中写入以下代码。同时添加frm2_FormClosed事件处理程序,如下图所示:
private void btnOpenForm_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed);
frm2.Show();
this.Hide();
}
private void frm2_FormClosed(object sender, FormClosedEventArgs e)
{
this.Close();
}
有一个非常简单的解决方案这一点。
问题(确定):启动应用程序(主窗体)>打开主窗体VIA按钮或任何事件的子窗体>关闭(主窗体)但子窗体也关闭。
解决方案:
用途:
Process.Start("Your_App's_EXE_Full_Path.exe");
示例:试试以获得完整的路径:
string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";
Process.Start(FullPath);
。
this.Close();
- 这样你会得到保持各种形式要保持开放。
不知道你所说的 “子窗体” 的意思。也许这是一个窗体上的面板上的按钮?或者它是一个MDI的东西?或者是孩子形成一个对话框? – 2008-09-03 02:31:18