A volte capita che torni comodo sapere se una determinata form (figlia della principale) è già stata aperta così da portarla semplicemente in primo piano anzichè crearne un’altra istanza.
Esistono un paio di tecniche: la prima più elegante, almeno secondo me, che fa ricorso a LINQ, mentre la seconda si basa su un semplice loop. Premetto subito che NON ho fatto dei test comparativi, anche perché normalmente un’applicazione è costituita da un numero abbastanza limitato di form che non consente di apprezzare differenze di prestazioni.
In entrambi p casi il codice che propongo è un pochino più prolisso del necessario: ho preferito infatti privilegiare la chiarezza alla compattezza.
Ricerca della form tramite LINQ
''' <summary>
''' Determina se una form è già aperta
''' </summary>
''' <remarks></remarks>
''' <param name="formType">Il tipo della form da ricercare</param>
''' <remarks>Determina se la form passata come argomento è già aperta.
''' Esempio di uso: IsOpen(GetType(frmInfo))</remarks>
Private Function IsOpen(formType As Type) As Boolean
Dim result = From form In Application.OpenForms
Where form.GetType() = formType
Select Name
If result.Count > 0 Then
Return True
Else
Return False
End If
End Function
L’uso è molto semplice ed è descritto brevemente nel commento di documentazione; aggiungo solo che in questo esempio frmInfo è il nome di una normalissima form che mostra le info dell’applicazione.
Ricerca della form tramite loop
''' <summary>
''' Determina se una form è già aperta
''' </summary>
''' <remarks></remarks>
''' <param name="formType">Il tipo della form da ricercare</param>
''' <remarks>Determina se la form passata come argomento è già aperta.
''' Esempio di uso: IsOpen(GetType(frmInfo))</remarks>
Private Function IsOpen(formType As Type) As Boolean
Dim result As Boolean = False
For Each frm As Form In Application.OpenForms
If frm.GetType().Name = formType.Name Then
result = True
Exit For
End If
Next
Return result
End Function
Come si può vedere, è molto simile alla precedente.