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.