Ответ 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
Я задаю этот вопрос, чтобы узнать больше. Как я могу узнать, открыта ли форма в моем приложении или нет, чтобы не открывать ее снова? Я имею в виду не создавать экземпляр той же формы, пока он работает
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 Как проверить, не открыта ли эта форма?
Вы можете попробовать это следующим образом:
If Application.OpenForms().OfType(Of Form2).Any Then
MessageBox.Show("Opened")
Else
Dim f2 As New Form2
f2.Text = "form2"
f2.Show()
End If
Вы можете использовать следующий код:
If myForm.IsHandleCreated then
myForm is open
End If
Для большей простоты вы можете создать общедоступную статическую переменную bool, которая сообщит, открыта ли форма или нет. В событии загрузки формы назначьте "истина", а при закрытом событии назначьте значение "false".
Ненависть быть радостью от убийства, но когда-нибудь кто-то попытается понять ваш код.
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
Затем выполните шоу и т.д. по мере необходимости?
Проверьте, открыта ли форма. Чтобы проверить, открыта ли форма, мы используем этот метод и функцию, чтобы иметь возможность вызывать из любой формы и использовать меньше кода.
Пример: Это будет использовать его в форме с 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
В качестве дополнения к ответам (спасибо, всем), здесь есть простой способ активировать или показать:
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
ДРУГОЙ путь рефакторинга от метода, инициированного 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
вы можете попробовать это
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