循环遍历所有 MDI 子窗体并关闭除当前窗体之外的所有其他窗体

3

我正在使用C#开发一个Winforms应用程序。我有一个带有菜单的MDI容器,通过按下按钮,相应的窗体就会显示在左侧。如果我点击打开Form1的按钮3次,那么就会打开6个Form1的实例。因此,我认为我需要编写一个方法来处理任何其他Form1实例的释放。通过以下方法,我正在循环遍历MDI子项,但我需要一些帮助来关闭除新窗体外的所有其他实例。

  public void DisposeAllButThis(Form form)
    {
        foreach (Form frm in this.MdiChildren)
        {
            if (frm == form)
            {
                frm.Dispose();
                return;
            }
        }
    }
7个回答

9

您需要检查表单是否也是相同类型:

public void DisposeAllButThis(Form form)
{
    foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType() == form.GetType() 
            && frm != form)
        {
            frm.Dispose();
            frm.Close();
        }
    }
}

关于Close和Dispose的更多信息,请参见:C# Form.Close vs Form.Dispose


顺便说一下:我刚刚改了代码,通过在循环中删除过早的返回语句! - Emond
你没有在关闭窗体之前释放它。 - Pankaj
@助手 - 我添加了Dispose的调用。顺便说一下:如果这些窗体是可见的,调用Close就足够了。 - Emond
你应该先进行处理,然后再关闭它。 - Pankaj

2
public void DisposeAllButThis(Form form)
{
    foreach (Form frm in this.MdiChildren)
    {
        if (frm != form)
        {
            frm.Dispose();   
            frm.Close();          
        }
    }
    return;
}

1
foreach (Form frm in this.MdiChildren)
{
   if (frm != form)
   {
      frm.Dispose();
      return;
   }
} 

0
private void closallforms()
        {
            foreach (Form frm in this.MdiChildren)
            {
                if (frm != Parent)
                {
                    frm.Close();
                }
            }
        }

2
如果您添加一些解释和文档链接,那么答案就会变得更有价值,这样原始发布者和其他用户就可以真正从中学习。 - Markus Safar

0
if (ActiveMdiChild != null)
    ActiveMdiChild.Close();

2
嗨,您需要在您的回答中提供更多信息。 - Samuel Diogo

0
如果您从另一个子窗体调用,可以使用以下代码:this.DisposeAllButThis(this.FindForm()); 并使用该方法:
private void DisposeAllButThis(Form form)
{
    foreach (Form frm in ParentForm.MdiChildren)
    {
       if (frm != form)
       {
          frm.Dispose();
          frm.Close();
       }
    }
 }

0
通过这个函数,你可以从另一个类中调用它: 并且注意这一点:frm.GetType() != Parent.GetType()
public void DisposeAllButThis(Form parentForm)
    {
        foreach (Form frm in Parent.MdiChildren)
        {
            if (frm.GetType() != Parent.GetType()
                && frm != Parent)
            {
                frm.Close();
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接