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

「For」の代わりに「while」ループを使用し、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 に答える