Подтвердить что ты не робот

Проверьте, открыта ли форма

Я задаю этот вопрос, чтобы узнать больше. Как я могу узнать, открыта ли форма в моем приложении или нет, чтобы не открывать ее снова? Я имею в виду не создавать экземпляр той же формы, пока он работает

   Dim frmCollection As New FormCollection()
    frmCollection = Application.OpenForms()
    If frmCollection.Item("Form2").IsHandleCreated Then
        MsgBox("Yes Opened")
    Else
        Dim f As New Form2()
        With f
            .Text = "form2"
            .Show()
        End With
    End If

если я выполняю этот код много раз, он создаст больше экземпляров формы Form2 Как проверить, не открыта ли эта форма?

4b9b3361

Ответ 1

Вы можете попробовать это следующим образом:

If Application.OpenForms().OfType(Of Form2).Any Then
  MessageBox.Show("Opened")
Else
  Dim f2 As New Form2
  f2.Text = "form2"
  f2.Show()
End If

Ответ 2

Вы можете использовать следующий код:

If myForm.IsHandleCreated then
   myForm is open
End If

Ответ 3

Для большей простоты вы можете создать общедоступную статическую переменную bool, которая сообщит, открыта ли форма или нет. В событии загрузки формы назначьте "истина", а при закрытом событии назначьте значение "false".

Ответ 4

Ненависть быть радостью от убийства, но когда-нибудь кто-то попытается понять ваш код.

Dim frm as New frmDontknow
Dim frmCollection = System.Windows.Forms.Application.OpenForms
For i As Int16 = 0I To frmCollection.Count - 1I
  If frmCollection.Item(i).Name = frm.Name Then
      frmCollection.Item(i).Activate()
      Exit Sub
  End If
Next i

Затем выполните шоу и т.д. по мере необходимости?

Ответ 5

Проверьте, открыта ли форма. Чтобы проверить, открыта ли форма, мы используем этот метод и функцию, чтобы иметь возможность вызывать из любой формы и использовать меньше кода.

Пример: Это будет использовать его в форме с mdiContainer и панельным объектом с 3 кнопками, которые показывают 3 формы окна.

Система импорта Импорт System.Reflection

Private Sub OpenWindowsForm(ByVal FormName As String)
    Dim instForm As Form = Application.OpenForms.OfType(Of Form)().Where(Function(frm) frm.Name = FormName).SingleOrDefault()
    If instForm Is Nothing Then
        Dim frm As New Form
        frm = DirectCast(CreateObjectInstance(FormName), Form)
        frm.MdiParent = Me
        Me.Panel1.Controls.Add(frm)
        Me.Panel1.Tag = frm
        frm.Show()
    Else
        instForm.Select()
        instForm.WindowState = FormWindowState.Maximized
        instForm.BringToFront()
    End If
End Sub

Public Function CreateObjectInstance(ByVal objectName As String) As Object
    Dim obj As Object
    Try
        If objectName.LastIndexOf(".") = -1 Then
            objectName = [Assembly].GetEntryAssembly.GetName.Name & "." & objectName
        End If

        obj = [Assembly].GetEntryAssembly.CreateInstance(objectName)

    Catch ex As Exception
        obj = Nothing
    End Try
    Return obj

End Function

Как использовать события click  Private Sub btnRegistro_Click (отправитель как объект, e As EventArgs) Обрабатывает btnRegistro.Click       OpenWindowsForm ( "Registro" )   End Sub

Private Sub btnBusqueda_Click(sender As Object, e As EventArgs) Handles btnBusqueda.Click
    OpenWindowsForm("Busqueda")
End Sub

Private Sub btnCalendario_Click_1(sender As Object, e As EventArgs) Handles btnCalendario.Click
    OpenWindowsForm("Calendario")
End Sub

Вот образ Образцового кода

Ответ 6

В качестве дополнения к ответам (спасибо, всем), здесь есть простой способ активировать или показать:

Dim frmCollection = System.Windows.Forms.Application.OpenForms
If frmCollection.OfType(Of Form2).Any Then
    frmCollection.Item("Form2").Activate()
Else
    Dim newForm2 = New Form2
    newForm2.Show()
End If

Ответ 7

ДРУГОЙ путь рефакторинга от метода, инициированного HumbleBeginnings:

    Dim xChildWindows = Application.OpenForms.OfType(Of frmForm2)
    If xChildWindows.Any Then
        xChildWindows.First().Focus() 'Focus if exists
    Else
        Dim xfrmNew As New frmForm2() 'Open window if doeasn't exists
        xfrmNew.MdiParent = Me
        xfrmNew.Show()
    End If

Ответ 8

вы можете попробовать это

Dim formText As String
Dim prevText As String

 Private Sub OpenForm(ByVal frm As Windows.Forms.Form)
        formText = frm.Text
        If formText = prevText Then Exit Sub
        CloseForms()
        ' Make it a child of this MDI form before showing it.
        frm.MdiParent = Me
        frm.Show()
        frm.Location = New Point(0, 0)
        prevText = formText
    End Sub

    Private Sub CloseForms()
        For Each ChildForm As Form In Me.MdiChildren
            ChildForm.Close()
        Next
    End Sub

    Private Sub NewToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PayablesToolStripMenuItem.Click
            OpenForm(frmPayables)
        End Sub