【发布时间】:2010-09-07 15:28:34
【问题描述】:
我需要从 Windows 应用程序的子表单中关闭父表单。最好的方法是什么?
【问题讨论】:
-
不确定您所说的“子表单”是什么意思。也许它是表单面板上的一个按钮?或者它是 MDI 的东西?还是子窗体是对话框?
我需要从 Windows 应用程序的子表单中关闭父表单。最好的方法是什么?
【问题讨论】:
有一个非常简单的解决方案。
问题(可以肯定):启动应用程序(主窗体)> 通过按钮或任何事件打开主窗体的子窗体 > 关闭(主窗体)但子窗体也关闭。
解决方案:
使用:
Process.Start("Your_App's_EXE_Full_Path.exe");
示例:试试这个以获得完整路径:
string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";
Process.Start(FullPath);.
this.Close();
- 这样您就可以保持所有您希望保持打开状态的表单。
【讨论】:
我遇到了这个博客条目,它看起来可以工作,它使用了 D2VIANT Answer 中的事件处理程序概念
http://www.dotnetcurry.com/ShowArticle.aspx?ID=125
总结: 第 1 步:创建一个新的 Windows 应用程序。打开 Visual Studio 2005 或 2008。转到文件 > 新建 > 项目 > 在“项目类型”> Windows 应用程序中选择 Visual Basic 或 Visual C#。为项目命名和位置 > 确定。
第 2 步:添加一个 n 新形式的项目。右键单击项目 > 添加 > 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();
}
【讨论】:
我同意大卫的观点;可以在子表单的构造函数中添加对父表单的引用,然后根据需要关闭父表单:
private Form pForm;
public ChildForm(ref Form parentForm)
{
pForm = parentForm;
}
private closeParent()
{
if (this.pForm != null)
this.pForm.Close();
this.pForm = null;
}
【讨论】:
您显然没有使用正确的方式打开和关闭表单。如果您使用任何形式的 MVC 或 MVP,则不会出现此问题。
所以使用 MVP 或 MVC 的形式来解决这个问题。
【讨论】:
也许考虑让父母订阅孩子的事件,孩子可以在想要关闭父母时触发该事件。然后父母可以处理它自己的关闭(连同孩子的)。
【讨论】:
当您在 WinForms 中关闭表单时,它会释放所有子表单。所以这不是一个好主意。您需要异步执行此操作,例如您可以向父表单发送消息。
【讨论】:
Form 类不提供对“父”Form 的任何类型的引用,因此无法直接访问父窗体(除非它恰好也是 MDI 父窗体,在这种情况下,您可以通过MDIParent 属性)。您必须在子项的构造函数中传递对父项的引用或属性,然后记得设置它,然后使用该引用强制父项关闭。
【讨论】: