我需要从 Windows 应用程序的子表单中关闭父表单。最好的方法是什么?
7 回答
我遇到了这个看起来可以工作的博客条目,它使用了 D2VIANT Answer 的事件处理程序概念
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();
}
当您在 WinForms 中关闭表单时,它会处理它的所有子项。所以这不是一个好主意。您需要异步执行此操作,例如您可以向父表单发送消息。
Form 类不提供对“父”表单的任何类型的引用,因此无法直接访问父级(除非它恰好也是 MDI 父级,在这种情况下,您可以通过 MDIParent 属性访问它)。您必须在子项的构造函数中传递对父项的引用,或者一个属性,然后记得设置它,然后使用该引用强制父项关闭。
也许考虑让父母订阅孩子的事件,孩子可以在想要关闭父母时触发该事件。然后父母可以处理它自己的关闭(连同孩子的)。
您显然没有使用正确的方式打开和关闭表单。如果您使用任何形式的 MVC 或 MVP,则不会出现此问题。
所以使用MVP或MVC的一种形式来解决这个问题。
我同意大卫;您可以将父表单的引用添加到子表单的构造函数中,然后根据需要关闭父表单:
private Form pForm;
public ChildForm(ref Form parentForm)
{
pForm = parentForm;
}
private closeParent()
{
if (this.pForm != null)
this.pForm.Close();
this.pForm = null;
}
有一个非常简单的解决方案。
问题(可以肯定):启动应用程序(主窗体)>通过按钮或任何事件打开主窗体的子窗体>关闭(主窗体)但子窗体也关闭。
解决方案 :
采用 :
Process.Start("Your_App's_EXE_Full_Path.exe");
示例:试试这个以获得完整路径:
string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";
Process.Start(FullPath);
.
this.Close();
- 这样,您就可以保留您想要保持打开状态的每一个表单。