【问题标题】:Loop through all MDI children and close all other forms except the current循环遍历所有 MDI 子窗体并关闭除当前窗体之外的所有其他窗体
【发布时间】:2012-07-03 10:17:29
【问题描述】:

我正在使用 c# 开发一个 winforms 应用程序。我有一个 MDI 容器,它在左侧有一个菜单,通过按下一个按钮,可以看到相应的表单。如果我单击打开 Form1 的按钮 3 次,则打开表单的 6 个实例。因此,我认为我必须编写一个处理任何其他 Form1 实例的方法。使用以下方法,我正在遍历 MDI 子项,但我需要一些帮助如何关闭除新实例之外的所有其他实例。

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

【问题讨论】:

    标签: c# winforms mdi


    【解决方案1】:

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

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

    有关关闭和处置的更多信息,请参阅:C# Form.Close vs Form.Dispose

    【讨论】:

    • 顺便说一句:我只是通过删除循环中的过早返回语句来稍微更改代码!
    • 您没有在关闭表单之前处理它。
    • @Helper - 我添加了对 Dispose 的调用。顺便说一句:如果这些表单可见,则调用 Close 就足够了
    • 你应该先处理然后关闭它。
    【解决方案2】:
    public void DisposeAllButThis(Form form)
    {
        foreach (Form frm in this.MdiChildren)
        {
            if (frm != form)
            {
                frm.Dispose();   
                frm.Close();          
            }
        }
        return;
    }
    

    【讨论】:

      【解决方案3】:
      foreach (Form frm in this.MdiChildren)
      {
         if (frm != form)
         {
            frm.Dispose();
            return;
         }
      } 
      

      【讨论】:

        【解决方案4】:

        通过这个 fanction 你可以从另一个类中调用它: 并注意这一点:frm.GetType() != Parent.GetType()

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

        【讨论】:

          【解决方案5】:
          private void closallforms()
                  {
                      foreach (Form frm in this.MdiChildren)
                      {
                          if (frm != Parent)
                          {
                              frm.Close();
                          }
                      }
                  }
          

          【讨论】:

          • 如果您添加一些解释和文档链接,答案会变得更有价值,因此原始发布者和其他用户实际上可以从中学习。
          【解决方案6】:

          如果您从另一个子窗体调用,您可以使用:this.DisposeAllButThis(this.FindForm());

          并使用方法:

          private void DisposeAllButThis(Form form)
          {
              foreach (Form frm in ParentForm.MdiChildren)
              {
                 if (frm != form)
                 {
                    frm.Dispose();
                    frm.Close();
                 }
              }
           }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-10
            相关资源
            最近更新 更多