BringToFront并没有将形式带到前线

时间:2013-07-30 13:50:47

标签: vb.net winforms

我正在尝试设置执行以下操作的按钮:

  1. 检查表单是否已打开(并且已失去焦点)。如果是这样,它会将这种形式带到前面。
  2. 如果没有,则会打开表单的新实例。
  3. 但是,我尝试了一些不同的方法,它总是创建一个新表单(如果我使用frm_About.visible作为检查)或者根本不做任何事情(使用以下代码)。

    Private Sub counter_aboutClick(sender As Object, e As EventArgs) Handles counter_About.Click
        If Application.OpenForms().OfType(Of frm_About).Any Then
            frm_About.BringToFront()
        Else
            Dim oAbout As frm_About
            oAbout = New frm_About()
            oAbout.Show()
            oAbout = Nothing
        End If
    End Sub
    

    我听说在某些情况下BringToFront存在错误,我是否遇到过该错误?

1 个答案:

答案 0 :(得分:4)

VB.Net做了一件可怕的事情,并创建了一个表单的默认实例(可以通过其类名称引用)。这会产生无穷无尽的混乱和头痛 - 我建议你阅读默认实例(谷歌可以找到很多内容,当然)

在这种情况下,您有一个名为frm_About的类以及该表单的默认实例,也称为frm_About。如果您已创建了frm_About类型的新表单,请输入以下代码

If Application.OpenForms().OfType(Of frm_About).Any Then
    frm_About.BringToFront()

将搜索您的打开表单以查找frm_About类型的表单,如果找到,则会尝试将frm_About的默认实例放在前面 - 请注意打开的表单可以be(在您的情况下很可能)不是默认实例,而是使用New frm_About()创建的任何实例。

要查找表单的实际实例,您必须执行以下操作:

For Each openForm In Application.OpenForms()
    If TypeOf (openForm) Is frm_About Then _
                                   CType(openForm, frm_About).BringToFront()
Next