Freigeben über


Gewusst wie: Zugriff auf alle geöffneten Formulare einer Anwendung

Aktualisiert: November 2007

In diesem Beispiel wird die My.Application.OpenForms-Eigenschaft verwendet, um die Titel aller geöffneten Formulare der Anwendung anzuzeigen.

Die My.Application.OpenForms-Eigenschaft gibt alle gegenwärtig geöffneten Formulare zurück, unabhängig davon, in welchem Thread diese jeweils geöffnet wurden. Vor dem Zugriff auf ein Formular müssen Sie daher die entsprechende InvokeRequired-Eigenschaft prüfen. Andernfalls wird möglicherweise eine InvalidOperationException-Ausnahme ausgelöst.

In diesem Beispiel wird eine Funktion deklariert, die den Titel jedes Formulars auf eine threadsichere Weise abruft. Zuerst wird die InvokeRequired-Eigenschaft des Formulars überprüft und bei Bedarf die BeginInvoke-Methode zum Ausführen der Funktion im Thread des Formulars verwendet. Anschließend gibt die Funktion den Titel des Formulars zurück.

Beispiel

Im Beispiel werden die geöffneten Formulare der Anwendung durchlaufen und deren Titel in einem ListBox-Steuerelement angezeigt. Eine einfachere Variante dieses Codes, bei dem nur die Formulare angezeigt werden, auf die ein direkter Zugriff über den aktuellen Thread möglich ist, finden Sie unter My.Application.OpenForms-Eigenschaft.

Private Sub GetOpenFormTitles()
    Dim formTitles As New Collection

    Try
        For Each f As Form In My.Application.OpenForms
            ' Use a thread-safe method to get all form titles.
            formTitles.Add(GetFormTitle(f))
        Next
    Catch ex As Exception
        formTitles.Add("Error: " & ex.Message)
    End Try

    Form1.ListBox1.DataSource = formTitles
End Sub

Private Delegate Function GetFormTitleDelegate(ByVal f As Form) As String
Private Function GetFormTitle(ByVal f As Form) As String
    ' Check if the form can be accessed from the current thread.
    If Not f.InvokeRequired Then
        ' Access the form directly.
        Return f.Text
    Else
        ' Marshal to the thread that owns the form. 
        Dim del As GetFormTitleDelegate = AddressOf GetFormTitle
        Dim param As Object() = {f}
        Dim result As System.IAsyncResult = f.BeginInvoke(del, param)
        ' Give the form's thread a chance process function.
        System.Threading.Thread.Sleep(10)
        ' Check the result.
        If result.IsCompleted Then
            ' Get the function's return value.
            Return "Different thread: " & f.EndInvoke(result).ToString
        Else
            Return "Unresponsive thread"
        End If
    End If
End Function

Siehe auch

Aufgaben

Gewusst wie: Threadsicheres Aufrufen von Windows Forms-Steuerelementen

Referenz

My.Application.OpenForms-Eigenschaft