Windows Forms per String-Namen aufrufen

Veröffentlicht: 04. Apr 2005

Von Mathias Schiffer

In diesem MSDN Quickie lernen Sie, wie Sie mithilfe von Reflection eine Windows Form ihres Projekts über deren Namen laden und anzeigen können.

Diese Methode ist lohnt sich dann, wenn Ihnen der Name einer Form lediglich als String zur Verfügung steht, etwa aus einer Datenbank oder einer Benutzereingabe.

Das .NET Framework ermöglicht es Ihnen, auf Basis der laufenden Assembly eine Instanz vom Typ der Form zu erzeugen: Um eine Referenz auf die laufende, eigene Assembly zu erhalten, verwenden Sie einfach die parameterlose Funktion GetExecutingAssembly aus dem Namespace System.Reflection.Assembly.

Für die erhaltene Assembly-Referenz steht die Funktion CreateInstance zur Verfügung, die als Parameter den Typnamen einer Klasse als String entgegennimmt. Dieser String-Parameter verlangt eine komplette Typbezeichnung in korrekter Groß-/Kleinschreibung. Es genügt nicht, nur den Namen der Klasse der Windows Form zu verwenden. Zusätzlich muss auch der Name der Assembly angegeben werden. In einem Projekt „WindowsApplication1“ würde also eine „Form1“ so übergeben werden: „WindowsApplication1.Form1“.

Mit dem folgenden Beispielcode (Visual Basic .NET) verfügen Sie über die sofort einsetzbare Prozedur ShowFormByName, an die Sie nur noch den Namen der Form als String übergeben müssen: Der Name der Assembly wird automatisch ermittelt und entsprechend ergänzt. Der Beispielcode befreit Sie – ganz im Stil von Visual Basic – zugleich auch von der von CreateInstance vorgegebenen Notwendigkeit der exakten Groß-/Kleinschreibung des Formnamens.

Public Sub ShowFormByName(ByVal FormName As String)
    ' Erzeugt eine neue Instanz einer Form auf Basis des
    ' Klassennamens der Form (z.B. "Form1") und zeigt
    ' diese neue Instanz an.
  
    Try
  
      ' Referenz auf die ausgeführte (diese) Assembly holen
      Dim myAssembly As System.Reflection.Assembly _
                      = System.Reflection.Assembly.GetExecutingAssembly()
  
      ' Den Namen der Assembly ermitteln:
      Dim strAssemblyName As String = myAssembly.GetName().Name.ToString
  
      ' Den kompletten Namen (inkl. Assemblynamen) des Form-Typs ermitteln
      ' (diese Zeile sorgt zudem für Toleranz bzgl. Groß-/Kleinschreibung):
      Dim FullName As String _
                   = myAssembly.GetType(strAssemblyName & "." & FormName, False, True).ToString
  
      ' Form instanzieren und Formvariable zuweisen
      Dim myForm As System.Windows.Forms.Form _
                 = CType(myAssembly.CreateInstance(FullName), _
                         System.Windows.Forms.Form)
  
      ' Die erzeugte Instanz anzeigen
      myForm.ShowDialog()
  
    Catch ex As System.NullReferenceException
  
      ' Formname existiert nicht - Standard: Keine Reaktion zeigen.
      ' Natürlich können Sie hier auch andere Reaktionen vorsehen.
  
    Catch ex As Exception
  
      ' Anderer Fehler, Fehlermeldung anzeigen.
      MessageBox.Show(ex.Message)
  
    End Try
  
  End Sub

Mathias Schiffer widmet sich als freier Softwareentwickler und Technologievermittler größeren Projekten ebenso wie arbeitserleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen in unzähligen Publikationen auch an andere Entwickler und Entscheider weiter. Sie erreichen ihn per E-Mail an die Adresse Schiffer@mvps.org.