none
Usercontrol mit String aufrufen RRS feed

  • Frage

  • Moin zusammen!

    Einem Public Sub kann ich wie folgt ein Usercontrol übergeben:

    Call UsercontrolAnzeigen(New usc_main_abt)

    "usc_main_abt" ist hier das im Projektmappen-Explorer vorhandene Usercontrol.

    Nun möchte ich Usercontrols aber anhand deren Namen in Form eines Strings übergeben. In etwa vielleicht so (dass das folgende Beispiel nicht funktionieren kann, ist mir klar. Es soll lediglich das Prinzip verdeutlichen):

    Dim _sName as string = "main_abt"
    Call UsercontrolAnzeigen(New "usc_" & _sName)

    Leider ist mir dies noch nicht gelungen.

    Wie lässt sich dies umsetzen? Die Recherche im Netz hat mir leider nicht zu einer Lösung verholfen.

    Vielen Dank.
    mmkeys

    Donnerstag, 19. Dezember 2019 10:11

Alle Antworten

  • Hallo mmkeys,

    Die Klassen und Methoden aus dem System.Reflection-Namespace eignen sich für die Erstellung einer Instanz des Benutzersteuerelements anhand seines Namens. Sieh Dir insbesondere Assembly.​Get​Executing​Assembly, Activator.CreateInstance und Object​Handle.​Unwrap an. Einige Beispiele findest Du in folgenden Threads:

    Reference a UserControl Class Based Off String Value (die letzte Antwort)
    Creating a user control object in runtime
    Dynamically load WPF User Control from random DLLD

    Folgender Thread geht auf die Umwandlung des Objekthandles ein:
    Cast ObjectHandle to UserControl

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 20. Dezember 2019 10:06
    Moderator
  • Hallo mmkeys,

    Haben Dich die CreateInstance und Unwrap-Methoden weitergebracht? Ist der Thread noch aktuell?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 3. Januar 2020 08:03
    Moderator
  • Hallo Dimitar,

    vielen Dank für Deine Antwort!
    Leider musste ich das Thema etwas zurückstellen, da sich einiges verschoben hat in der Abarbeitung.

    Dennoch sehe ich beim Querlesen der Links, dass diese genau meinen Fall betrafen. Wenn das Thema wieder aktuell wird, hast Du mir hier eine wunderbare Grundlage aufgelistet. Danke dafür!

    Ich denke, dass der Thread hiermit als abgeschlossen gelten darf.

    Beste Grüße
    mmkeys

    Montag, 27. Januar 2020 09:42
  • Hallo Dimitar,

    ich befasse mich nun wieder mit dem Thema und habe mich mal mit dem ersten Deiner Links und darin dem letzten Beitrag befasst.

    Die USerControls sind ja bereits im Modul mdlUsercontrols definiert:

    #Region "USERCONTROLS" '<<<<< Hier die Usercontrols ins Projekt einbinden <<<<<
        Public _uscAnmeldung As New USCAnmeldung
        Public _usc_main_fkbe As New USCmain_fkbe
        Public _usc_main_abt As New USCmain_abt
        Public _usc_main_pers As New USCmain_pers
        Public _usc_pdv_rtg As New USCpdv_rtg
        Public _usc_fin_devk As New USCfin_devk
    #End Region


    Entsprechend habe ich nun aus folgender Funktion heraus versucht, diese Usercontrols per Name zu erreichen:

        Public Sub EinzelanwendungStarten(ByVal _sFunktion As String)
    
            Dim _sUsercontrolName As String = "_usc_" & _sFunktion
            Dim Assem = [Assembly].GetExecutingAssembly()
            Dim MyType As Type = Assem.GetType(_sUsercontrolName.Trim)
            Dim MyObject As Object = Nothing
            Try
                MyObject = Activator.CreateInstance(MyType)
            Catch ex As TargetInvocationException
                MessageBox.Show(ex.ToString)
            End Try
    
            Call UsercontrolAnzeigen(DirectCast(MyObject, UserControl))
    
        End Sub

    Die Variable "Assem" ist aber leider immer Nothing...

    Was fehlt hier noch?

    Besten Dank!

    mmkeys

    Donnerstag, 30. Januar 2020 10:55
  • Hallo mmkeys,

    Ist die gesuchte Klasse (die mit dem Wert der Variablen _sUserControlName benannt wurde) in der gleichen (gerade ausgeführten) Assembly definiert oder in einer derzeit geladenen? Für den zweiten Fall verwende die GetAssembly-Methode anstatt GetExecutingAssembly. Ein Beispiel findest Du in diesem Thread:
    Dynamically cast a control type in runtime

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 31. Januar 2020 09:56
    Moderator
  • Okay,

    leider komme ich nicht weiter. Ich habe mit den Informationen versucht zu arbeiten (GetAssembly & Co.). Immer ist irgendetwas nothing.

    Die Frage nach der Assembly kann ich nicht sicher beantworten. Wenn Assembly die Sammlung von Userform, Usercontrols, Modulen und Klassen innerhalb eines Projekts bedeutet, dass wäre meine Antwort ja. Die Begriffserklärungen nach Google & Co. verstehe ich leider nicht...

    Deswegen mal eine anderer Weg:
    Weg von meinem konkreten Code oben - mal ganz nackig ein neues Projekt:
    Im Projektexplorer ist eine Form1 und ein Usercontrol1. Form1 beinhaltet ein Panel zur Anzeige des Usercontrols (Panel1) und drei Buttons:
    1) "Öffnen" (btnÖffnen)
    2) "Verstecken" (btnHide)
    3) "Schließen" (btnSchließen)

    Das Usercontrol soll nun auf Basis seines Namens im Projektexplorer geöffnet werden. Also "Usercontrol1".


    Hier mal das nicht lauffähige Beispielprojekt, alles innerhalb des Sourcecodes von Form1. Die reine Anzeige des Usercontrols funktioniert schon nicht, geschweige denn die anderen Buttons wie hide und schließen...

    Imports System.Reflection
    
    Public Class Form1
        '-> Name des Usercontrols auf Basis des Projektexplorers
        Private _sUsercontrolName As String = "UserControl1"
    
        '-> Anzeigen des Usercontrols in Panel1 anhand von "_sUsercontrolName"
        Private Sub btnÖffnen_Click(sender As Object, e As EventArgs) Handles btnÖffnen.Click
    
            Dim Assem = [Assembly].GetExecutingAssembly()
            Dim MyType As Type = Assem.GetType(_sUsercontrolName.Trim)
            Dim MyObject As Object = Nothing
            Try
                If IsNothing(MyType) Then
                    MyObject = New DirectCast(_sUsercontrolName, UserControl) '-> Das Funktioniert hier natürlich nicht...
                Else
                    MyObject = Activator.CreateInstance(MyType)
                End If
            Catch ex As TargetInvocationException
                MessageBox.Show(ex.ToString)
            End Try
    
            MyObject.Parent = Panel1
        End Sub
    
        '-> Parent des Usercontrols entziehen, aber nicht zerstören, anhand von "_sUsercontrolName"
        Private Sub btnHide_Click(sender As Object, e As EventArgs) Handles btnHide.Click
    
        End Sub
    
        '-> Zerstören des Usercontrols Anhand von "_sUsercontrolName"
        Private Sub btnSchließen_Click(sender As Object, e As EventArgs) Handles btnSchließen.Click
    
        End Sub
    End Class

    Könntet ihr mir dieses Beispiel ggf. lauffähig machen? Dann kann ich von hier aus auf mein laufendes Projekt schließen.

    Besten Dank!

    Beste Grüße
    mmkeys


    • Bearbeitet mmkeys Freitag, 14. Februar 2020 09:17
    Freitag, 14. Februar 2020 09:16