如何在 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

vuejs 从子组件更新父数据

vuejs 从子组件更新父数据

如何在 Ubuntu 上的 MonoDevelop 中使用 System.Windows.Forms?

如何在 .NET Core 类库中使用 System.Windows.Forms

在 `System.Windows.Forms` 控件中没有 `ref` 关键字的情况下,如何通过引用传递