如何在 Windows Forms 2.0 中从子窗体关闭父窗体?
Posted
技术标签:
【中文标题】如何在 Windows Forms 2.0 中从子窗体关闭父窗体?【英文标题】:How do I close a parent Form from child form in Windows Forms 2.0? 【发布时间】:2010-09-07 17:05:54 【问题描述】:我需要从 Windows 应用程序的子表单中关闭父表单。最好的方法是什么?
【问题讨论】:
不确定您所说的“子表单”是什么意思。也许它是表单面板上的一个按钮?或者它是 MDI 的东西?还是子窗体是对话框? 【参考方案1】:有一个非常简单的解决方案。
问题(可以肯定):启动应用程序(主窗体)> 通过按钮或任何事件打开主窗体的子窗体 > 关闭(主窗体)但子窗体也关闭。
解决方案:
使用:
Process.Start("Your_App's_EXE_Full_Path.exe");
示例:试试这个以获得完整路径:
string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";
Process.Start(FullPath);
.这样您就可以保持所有您希望保持打开状态的表单。
this.Close();
【讨论】:
【参考方案2】:我遇到了这个博客条目,它看起来可以工作,它使用了 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();
【讨论】:
【参考方案3】:我同意大卫的观点;可以在子表单的构造函数中添加对父表单的引用,然后根据需要关闭父表单:
private Form pForm;
public ChildForm(ref Form parentForm)
pForm = parentForm;
private closeParent()
if (this.pForm != null)
this.pForm.Close();
this.pForm = null;
【讨论】:
我有同样的问题,这个解决方案不适用于我的情况。同样在第二种形式中,我正在启动一个 Thread ,这是否会产生问题。【参考方案4】:您显然没有使用正确的方式打开和关闭表单。如果您使用任何形式的 MVC 或 MVP,则不会出现此问题。
所以使用 MVP 或 MVC 的形式来解决这个问题。
【讨论】:
【参考方案5】:也许考虑让父母订阅孩子的事件,孩子可以在想要关闭父母时触发该事件。然后父母可以处理它自己的关闭(连同孩子的)。
【讨论】:
【参考方案6】:当您在 WinForms 中关闭表单时,它会释放所有子表单。所以这不是一个好主意。您需要异步执行此操作,例如您可以向父表单发送消息。
【讨论】:
【参考方案7】:Form 类不提供对“父”Form 的任何类型的引用,因此无法直接访问父窗体(除非它恰好也是 MDI 父窗体,在这种情况下,您可以通过MDIParent 属性)。您必须在子项的构造函数中传递对父项的引用或属性,然后记得设置它,然后使用该引用强制父项关闭。
【讨论】:
以上是关于如何在 Windows Forms 2.0 中从子窗体关闭父窗体?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms 中用于 .Net Standard 2.0 的 ModernHttpClient
如何在 Ubuntu 上的 MonoDevelop 中使用 System.Windows.Forms?