Перебирать формы Windows и закрывать их?

Я пытаюсь использовать следующий код, чтобы перебрать все открытые в настоящее время формы в моем приложении и закрыть их, за исключением основной формы, как часть очистки.

    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 ответа

Решение

Выполните итерацию в обратном направлении, чтобы модификация коллекции не была байтовой:

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

Используйте цикл while вместо "For", отметьте Application.OpenForms.Count > 1 Когда вы используете цикл while, вы делаете "что-то", когда происходит "что-то еще". Вы не выполняете итерацию коллекции, и она не мутирует на вас.

Еще один способ сделать это:

For Each OFORM in Application.Openforms
    With OFORM
        'Methods and conditions here
    End With
Next OFORM
Другие вопросы по тегам