如何在Windows Forms 2.0中从子窗体关闭父窗体?
我需要从Windows应用程序的子窗体中关闭父窗体。最好的方法是什么?
解决方案
回答
当我们在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; }
回答
我遇到了这个博客条目,它似乎可以正常工作,并且使用了D2VIANT Answer中的事件处理程序概念
http://www.dotnetcurry.com/ShowArticle.aspx?ID=125
概括:
步骤1:创建一个新的Windows应用程序。打开Visual Studio 2005或者2008. 转到"文件">"新建">"项目">在"项目类型">" Windows应用程序"中选择" Visual Basic"或者" Visual C"。为项目命名和位置>确定。
第2步:添加n
ew形式的项目。右键单击项目>添加> 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(); }