如何在Windows Forms 2.0中从子窗体关闭父窗体?

时间:2020-03-05 18:46:49  来源:igfitidea点击:

我需要从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();
    }