web-dev-qa-db-fra.com

Vérifier si le formulaire est ouvert

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

24
Mohammed Khaled

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
41
LarsTech

Vous pouvez utiliser le code suivant:

If myForm.IsHandleCreated then
   myForm is open
End If
9
user3124064

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".

3

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?

1
Fobbert

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

Voici une image du code exemple

1
FERIOS

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
0
HumbleBeginnings

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
0
Dave

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
0
Jun Gie Cas