从另一种形式关闭MDI子表单

时间:2011-08-22 00:59:48

标签: c#

我有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配置的一部分...我试图引用和关闭/终止子窗体app_frm,其父级是main_frm ...我知道currentForm是main_frm,但不知道为什么它不会找到子窗体,所以我可以引用它?我尝试将循环更改为“currentForm.MdiChildren”并仍然获得相同的空引用异常...

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

1 个答案:

答案 0 :(得分:0)

您确定app_frm_temp对象是否引用了app_frm表单的已打开实例?如果它是你的app_frm的FormClosing事件,你必须正确地向你的进程/线程发送结束通知,这里给出了一个很好的例子,用于在关闭表单之前停止后台线程/进程:{{3} }

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

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