通过Windows窗体迭代并关闭它们?

时间:2012-10-17 17:49:11

标签: vb.net winforms foreach

我正在尝试使用以下代码迭代我的应用程序中的所有当前打开的表单,并关闭它们,除了主表单作为清理的一部分。

    Dim openForms As Windows.Forms.FormCollection = Application.OpenForms

    For Each frm As Windows.Forms.Form In openForms
        If frm.Name.ToString() <> "FrmMainNew" Then
            frm.Close()
        End If
    Next

但是,我收到InvalidOperationException,因为执行frm.Close()时,openForms中的条目将被删除,从而更改集合的大小。我显然做错了,所以如果有人能指出我这里的问题,那就太棒了。否则,有没有其他方法可以做这样的事情?

3 个答案:

答案 0 :(得分:6)

向后迭代,以便修改集合不是字节:

    For ix As Integer = Application.OpenForms.Count - 1 To 0 Step -1
        Dim frm = Application.OpenForms(ix)
        '' etc..
    Next

答案 1 :(得分:1)

使用“while”循环而不是“For”,检查Application.OpenForms.Count&gt; 1 当你使用while循环时,你会在“其他东西”发生时做“某事”。你不会迭代收集,也不会改变你。

答案 2 :(得分:0)

另一种方法:

For Each OFORM in Application.Openforms
    With OFORM
        'Methods and conditions here
    End With
Next OFORM