4

我需要从 Windows 应用程序的子表单中关闭父表单。最好的方法是什么?

4

7 回答 7

5

我遇到了这个看起来可以工作的博客条目,它使用了 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();
    }
于 2008-09-03T16:49:12.750 回答
3

当您在 WinForms 中关闭表单时,它会处理它的所有子项。所以这不是一个好主意。您需要异步执行此操作,例如您可以向父表单发送消息。

于 2008-09-03T00:35:12.467 回答
0

Form 类不提供对“父”表单的任何类型的引用,因此无法直接访问父级(除非它恰好也是 MDI 父级,在这种情况下,您可以通过 MDIParent 属性访问它)。您必须在子项的构造函数中传递对父项的引用,或者一个属性,然后记得设置它,然后使用该引用强制父项关闭。

于 2008-09-03T00:36:22.073 回答
0

也许考虑让父母订阅孩子的事件,孩子可以在想要关闭父母时触发该事件。然后父母可以处理它自己的关闭(连同孩子的)。

于 2008-09-03T06:59:49.593 回答
0

您显然没有使用正确的方式打开和关闭表单。如果您使用任何形式的 MVC 或 MVP,则不会出现此问题。

所以使用MVP或MVC的一种形式来解决这个问题。

于 2008-09-03T07:20:36.453 回答
0

我同意大卫;您可以将父表单的引用添加到子表单的构造函数中,然后根据需要关闭父表单:

private Form pForm;
public ChildForm(ref Form parentForm)
{
    pForm = parentForm;
}

private closeParent()
{
    if (this.pForm != null)
        this.pForm.Close();
    this.pForm = null;
}
于 2008-09-03T12:46:46.950 回答
0

有一个非常简单的解决方案。

问题(可以肯定):启动应用程序(主窗体)>通过按钮或任何事件打开主窗体的子窗体>关闭(主窗体)但子窗体也关闭。

解决方案 :

采用 :Process.Start("Your_App's_EXE_Full_Path.exe");

示例:试试这个以获得完整路径:

  1. string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";

  2. Process.Start(FullPath);.

  3. this.Close();

    • 这样,您就可以保留您想要保持打开状态的每一个表单。
于 2017-08-09T16:20:06.933 回答