如何在 WinForms MDI 环境中正确实现 CloseAllForms()?

How to correctly implement CloseAllForms() in WinForms MDI environment?

我测试了多种关闭所有MDI子窗体的方法,但它们似乎不稳定。在很多情况下,我会得到 ObjectDisposedException.

我尝试了什么:

'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()

如何以稳定的方式关闭所有打开的表单?

(如果要摘录一些代码,可以选择C#或者VB.NET。)

我找到问题了。窗体调用 CloseAllForms() 试图在关闭所有窗体(包括其自身)后操作其控件。检查 Disposing Or IsDisposed 表达式有助于避免该问题。

我将继续使用 closing approach shown by Microsoft,即不创建表单集合的副本,而是迭代实时集合并仅在某些表单必须从关闭中排除(或无效)时才增加索引。

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