0

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

    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删除了其中的条目,从而改变了集合的大小。我显然做错了什么,所以如果有人能在这里指出我的问题,那就太棒了。否则,还有其他方法可以做这样的事情吗?

4

3 回答 3

6

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

    For ix As Integer = Application.OpenForms.Count - 1 To 0 Step -1
        Dim frm = Application.OpenForms(ix)
        '' etc..
    Next
于 2012-10-17T18:09:24.493 回答
1

使用“while”循环而不是“For”,检查 Application.OpenForms.Count > 1 当您使用 while 循环时,您会在“其他事情”发生时执行“某事”。你不迭代槽收集,它不会对你发生变异。

于 2012-10-17T18:27:33.443 回答
0

另一种方法:

For Each OFORM in Application.Openforms
    With OFORM
        'Methods and conditions here
    End With
Next OFORM
于 2016-04-16T19:31:33.927 回答