关闭所有打开的表单,除了一些 VB.Net

Posted

技术标签:

【中文标题】关闭所有打开的表单,除了一些 VB.Net【英文标题】:Close all open forms except for some VB.Net 【发布时间】:2019-01-01 18:40:24 【问题描述】:

作为标题,我正在尝试关闭所有打开的表单,但 VB.Net 中的一些表单除外,但表单并没有关闭。 这是我使用的代码:

Dim lista As New FormCollection
lista = Application.OpenForms
For Each a As Form In lista
    If Not a.Text = "formLogout" And a.Text = "arresto" And a.Text = "riavvio" And a.Text = "formOpen" Then
        a.Close()
    End If
Next
scrivania.Close()
Me.Close()

格雷西。

【问题讨论】:

你的表达是parsed as If (Not (a.Text = "formLogout")) And (a.Text = "arresto") And (a.Text = "riavvio") And (a.Text = "formOpen") Then 总是假的。 @GSerg:感谢您强调布尔表达式中关联性的重要性。在我看来,括号的使用应该是强制性的 @GSerg 我用括号试过了,但它不起作用。 @HelloXD 我没有告诉你尝试使用括号。我展示了(在括号的帮助下)你的表达式是如何当前解析的。 在一行上说 Dim lista As New FormCollection(强调“新”)和在下一行上说 lista = somethingelse 表明了对语言如何处理对象引用与对象实例的核心误解。 【参考方案1】:

与@Fabio 的答案相同,没有额外的收集和循环。

    Dim keepOpen As New List(Of String) From Me.Text, Form2.Text, Form3.Text
    For index = Application.OpenForms.Count - 1 To 0 Step -1
        If Not keepOpen.Contains(Application.OpenForms(index).Text) Then
            Application.OpenForms(index).Close()
        End If
    Next

【讨论】:

或者你可以使用For Each form As Form in Application.OpenForms.Reverse() @Fabio 在 Application.OpenForms.Reverse() 下有一个红色曲线。虽然它应该实现 IEnumerable 它是一个只读属性。这是否意味着它不能使用 .Reverse? For Each form As Form In Application.OpenForms.OfType(Of Form).Reverse() Linq 扩展应用于特定的集合类型。 OfType() 返回 IEnumerableOpenForms 不返回。 @Jimi 知道了。谢谢。【参考方案2】:

If 语句将返回 true 当所有提供的条件都为真时,这是不可能的,因为您将相同的 form.Text 与不同的值进行比较。 请注意,在您的示例中,Not 仅适用于第一个条件

条件可以改写如下:

If Not (form.Text = "formLogout" OrElse form.Text = "arresto") Then ..

建议使用表单名称的集合,不要关闭

Dim remainOpenForms As New HashSet(Of String)
remainOpenForms.Add("formLogout")
remainOpenForms.Add("arresto")

' Create collection of forms to be closed
Dim formsToClose As New List(Of Form)
For Each form As Form In Application.OpenForms
    If remainOpenForms.Contains(form.Text) = False Then formsToClose.Add(form)
Next

For Each form As Form In formsToClose
    form.Close()
Next

【讨论】:

它不起作用。它也给了我一个例外,因为表单集合已更改。 @法比奥 @HelloXD,是的,在ApplicationOpenForms 的迭代过程中,您无法关闭表单,因为关闭时表单将被移除。检查更新的答案。 @Fabio 感谢您介绍 HashSet。它有一些非常有趣的方法。【参考方案3】:

我知道为时已晚,但对于某些人来说,这是我的答案

它的作用是关闭除“exceptthisform”之外的所有表单

     Dim formNames As New List(Of String)

        For Each currentForm As Form In Application.OpenForms

            If currentForm.Name <> "exceptthisform" Then

                formNames.Add(currentForm.Name)

            End If

        Next

        For Each currentFormName As String In formNames
            Application.OpenForms(currentFormName).Close()

        Next

【讨论】:

【参考方案4】:

我用 Fabio 的解决方案中的 form.Name 替换了 form.toString,效果非常棒!

    Try
        Dim remainOpenForms As New HashSet(Of String)
        remainOpenForms.Add("FormMainMenu")

        Dim formsToClose As New List(Of Form)
        For Each form As Form In Application.OpenForms
            If Not remainOpenForms.Contains(form.Name) Then
                formsToClose.Add(form)
                Debug.Print("closing: " & form.Name)
            Else
                Debug.Print("keep open: " & form.Name)
            End If
        Next

        For Each form As Form In formsToClose
            form.Close()
        Next

        Close()
    Catch ex As Exception
        WriteErrors("FMM: WAN2", ex.ToString)
    End Try

如果您想知道我为什么在之后关闭它:我收到了一个 InvalidOperationException 集合已修改。这是我的退出应用程序模块

【讨论】:

以上是关于关闭所有打开的表单,除了一些 VB.Net的主要内容,如果未能解决你的问题,请参考以下文章

如何从 vb.net 中的子表单访问父表单属性

如何在打开对话框的表单窗口顶部打开 VB.Net 对话框窗口?

拖放 - vb.net

关闭 Access 时防止打开表单的“保存设计更改”

在 VB.NET 的任务管理器应用程序选项卡中隐藏表单

使用 Xamarin 跨平台打开开始表单并关闭所有其他表单