Перебирать формы 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