2012-10-17 46 views
0

我想使用下面的代碼遍歷我的應用程序中的所有當前打開的窗體,並關閉它們,除了主窗體作爲清理的一部分。通過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的條目被刪除,改變了集合的大小。我顯然做錯了,所以如果任何人都可以在這裏指出我的問題,那就太棒了。否則,是否有另一種方式來做這樣的事情?

回答

6

迭代向後,這樣修改,集合不字節:

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

謝謝!這對我有效。 – Cuthbert

1

使用「而」循環,而不是「因」,檢查Application.OpenForms.Count> 1 當您使用while循環,你在「其他」發生時做「某事」。你不會迭代低谷收集,它不會改變你。

0

另一種方式來做到這一點:

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