Je donne cette question pour plus de connaissances. Comment savoir si le formulaire est ouvert ou non dans mon application, pour ne pas l'ouvrir à nouveau, je ne veux pas créer une instance du même formulaire pendant son exécution
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
si j'exécute ce code plusieurs fois, il créera plusieurs instances du formulaire Form2Comment puis-je vérifier si ce formulaire n'est pas déjà ouvert
Vous pouvez l'essayer comme ça:
Imports System.Linq ' need to add
If Application.OpenForms().OfType(Of Form2).Any Then
MessageBox.Show("Opened")
Else
Dim f2 As New Form2
f2.Text = "form2"
f2.Show()
End If
Vous pouvez utiliser le code suivant:
If myForm.IsHandleCreated then
myForm is open
End If
Pour plus de simplicité, vous pouvez créer une variable publique statique bool qui indiquera si le formulaire est ouvert ou non. Lors d'un événement de chargement de formulaire, attribuez la valeur "true" et à la fermeture, la valeur "false".
Déteste être une joie de tuer, mais un jour, quelqu'un va essayer de comprendre votre code.
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
Ensuite, faites-vous le spectacle, au besoin?
Vérifier si le formulaire est ouvert, Pour valider si un formulaire est ouvert, nous utilisons cette méthode et cette fonction pour pouvoir appeler depuis n'importe quel formulaire et utiliser moins de code.
Exemple: Ceci sera utilisé dans un formulaire avec mdiContainer et un objet de panneau avec 3 boutons affichant le formulaire à 3 fenêtres.
Système d'importation Système d'importation.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
Comment utiliser dans les événements de clic Private Sub btnRegistro_Click (l'expéditeur en tant qu'objet, et en tant que EventArgs) gère 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
Dans le prolongement des réponses données (merci à tous), voici un moyen simple d'activer ou de montrer:
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
Un autre moyen de refactoring de celui initié par 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
tu peux essayer ça
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