2015-02-23 38 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住在一起,即不是创建表单集合的副本,而是在实时采集上迭代并仅在某些表单必须从关闭(或无效)中排除表单时增加索引。

另一方面,我相信问题中提到的其他方法几乎是相同的。正如我发现的那样,问题在其他地方。