【问题标题】:close MDI child form from another form从另一个窗体关闭 MDI 子窗体
【发布时间】:2011-08-22 09:54:22
【问题描述】:

我有 3 个表格。

  • main_frm 是 MDI
  • app_frm 是子 MDI
  • progress_frm 只是一个显示 app_frm 进度的表单

在progress_frm 表单中,我有一个名为“cancel”的按钮,用于关闭progress_frm 表单。然后在关闭progress_frm时发生以下事件。

    private void frm_progress_Closing(object sender, FormClosingEventHandler e)
    {

        Form currentForm = Form.ActiveForm;

        Form app_frm_temp = currentForm.ActiveMdiChild;

        app_frm_temp.Dispose();

    }

我预计 app_frm 表单将关闭并终止它正在执行的任何操作。但这并没有发生.. 只有progress_frm 表单关闭,我仍然看到app_frm 与沙漏一起运行并且仍在运行它的进程/线程。

我的目标是,如果用户想要中止并关闭 app_frm 启动的进程,他们将能够从 progress_frm 终止和关闭 app_frm?

在下面的反馈之后,我尝试了以下操作,我的表单没有达到结束事件,因为我从另一个表单复制并粘贴了它,然后我继续进行 progress_frm 的设计部​​分,并为此感到抱歉:( :

      private void progress_frm_FormClosing(object sender, FormClosingEventArgs e)
    {
        Form currentForm = Form.ActiveForm;



        foreach (Form frm in currentForm.MdiParent.MdiChildren) 
        { 
            if (frm.GetType() == currentForm.GetType()) 
            { 
                frm.Focus(); 
                return; 
            } 
        } 
    }

当循环访问 currentForm 时,我得到一个空异常“对象引用未设置为对象的实例”。请记住,我是 progress_frm,它不是 MDI 配置的一部分...我正在尝试引用和关闭/终止父为 main_frm 的子窗体 app_frm ...我知道 currentForm 是 main_frm,但不知道为什么它找不到子窗体以便我可以引用它?我尝试将循环更改为“currentForm.MdiChildren”,但仍然得到相同的空引用异常......

我以为我理解 MDI 概念,但现在对如何正确引用它们感到困惑

【问题讨论】:

  • 如果 frm_progress 和 app_frm 都是同一个 Mdi 父级的子级,那么我认为不需要使用 Form.ActiveForm;而是在 foreach 循环中,使用 this.MdiParent.MdiChildren... 而且,为了关闭表单,将 'frm.Focus()' 替换为 'frm.Close()'

标签: c#


【解决方案1】:

您确定您的app_frm_temp 对象引用了app_frm 表单的打开实例吗?如果是在您的 app_frm 的 FormClosing 事件上,您必须正确地将关闭通知发送到您的进程/线程,这里给出了一个很好的示例,用于在关闭表单之前停止后台线程/进程:How to stop BackgroundWorker on Form's Closing event?

但在此之前只是为了确保您引用的是正确的 Form 实例,这就是您如何循环所有打开的 MDI 子项并获取对您感兴趣的子项的引用:

foreach (Form frm in this.MdiParent.MdiChildren)
     {
          if (frm.GetType() == app_frm.GetType())
          {
               frm.Focus();
               return;
          }
     }

【讨论】:

  • thx ,我更新了我的问题......我尝试了你的建议,但仍然没有得到任何结果......我在结束活动中将 progress_frm 引用为 frm_progress,抱歉我更正了......
猜你喜欢
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多