2015-02-23 35 views
0

我已經測試了多種方法來關閉所有的MDI子窗體,但它們似乎不穩定。在很多情況下,我會得到ObjectDisposedException如何在WinForms MDI環境中正確實現CloseAllForms()?

我試了一下:

'collect copy of app forms array 
Dim formsToClose As Form() = My.Application.OpenForms.OfType(Of Form).ToArray() 

'iterate over collection, skip special forms 
For i As Integer = LBound(formsToClose) + 1 To UBound(formsToClose) 
    Dim f As Form = formsToClose(i) 
    If f Is Nothing OrElse frmSpecial.IsMyInstance(f) Then Continue For 
    Try 
     clsWinForms.ForceCloseForm(f) 
    Catch ex As Exception 
     'some code here 
    End Try 
Next i 

ForceCloseForm()確實Form.Close()它關閉後表單驗證。

  • 這種方法隨機崩潰ObjectDisposedException
  • 運行索引從最後到0崩潰的概率更高。來自微軟的
  • While-loop-based trick(在live collection上運行,保持索引在成功上不變)也以同樣的方式崩潰。
  • 如果我插入測試f.Disposingf.IsDisposed,沒有任何改善。

如何以穩定的方式關閉所有打開的窗體?

(如果你想給一些代碼片段,您可以選擇C#或VB.NET)

回答

0

我已經找到了問題。致電CloseAllForms()的表格在關閉所有表格(包括其本身)完成後試圖操作其控件。檢查Disposing Or IsDisposed表達式有助於避免此問題。

我與closing approach shown by Microsoft住在一起,即不是創建表單集合的副本,而是在實時採集上迭代並僅在某些表單必須從關閉(或無效)中排除表單時增加索引。

另一方面,我相信問題中提到的其他方法幾乎是相同的。正如我發現的那樣,問題在其他地方。