Benutzerdefiniertes Steuerelemt aus einer Klasse auf eine Form legen VisualBasic.Net

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Duster.

    Benutzerdefiniertes Steuerelemt aus einer Klasse auf eine Form legen VisualBasic.Net

    Einen schönen guten Morgen :) ,

    ein super Forum habt Ihr hier. Seit ich VB lerne bin ich mitleser aber erst seit heute registrierter Benutzer.

    Ich habe folgendes Problem (IDE: VisualStudio 2019 Pro):

    Ich habe ein benutzerdefiniertes Steuerelement entworfen das aus einem Button und einem Label besteht.
    Ich möchte dieses Control aus einer Klasse heraus (GUI_cls) bei Bedarf auf beliebige Formen legen können, per Code und nicht manuell!
    Es klappt aber einfach nicht die Form bleibt leer, keine Fehlermeldung.
    Ich poste mal den bereinigten Code!

    Form1:

    VB.NET-Quellcode

    1. Public Class FrmStart
    2. Private Sub FrmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. End Sub
    4. End Class



    GUI-cls:

    VB.NET-Quellcode

    1. Public Class GUI_cls
    2. 'Code um Contol auf eine beliebige Form zu legen
    3. End Class



    MyControl

    VB.NET-Quellcode

    1. Public Class MyControl
    2. Private Sub MyControl_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Init_Control()
    4. End Sub
    5. Public Function Init_Control() 'Vorinitialisierung
    6. With Button1
    7. .Name = "CmdSimple"
    8. .Text = "Simple!"
    9. End With
    10. End Function
    11. End Class


    Ich schreibe gerade ein Prg. bei dem sich diese Anordnung von Controls (und noch einige andere) ständig wiederholt und möchte dadurch das Erstellen der Oberfläche schneller und dynamischer gestalten!

    Ich probiere schon sein einigen Tagen an dem Problem herum, komme aber auf keinen grünen Zweig.
    Um die Beantwortung so einfach wie möglich zu halten, habe ich so wenig Beispielsource wie möglich geschickt!

    Den Code des kleinen Beispielprogramms findet Ihr im Anhang.

    Ich hoffe Ihr könnt mir dabei helfen :!:


    Vielen Dank schon hier für Eure Mühe und Hilfe,
    Duster

    P.S.: Hier noch ein Bild des Controls:

    Dateien
    Hallo ErfinderDesRades,

    danke für die Antwort.
    Das hab ich schon getan aber irgendwie klappt's halt nicht :huh:
    Ich bin so weit, dass ich hoffe, dass mir jemand mit einem kleinen funktionierenden SSource (den, den ich gepostet) habe aushilft, ich hab mich da richtig verrant.
    ich möchte nicht dass mir jemand die Hausaufgaben macht aber ein funktionierender Source sagt mehr als 1000 Worte!

    @Dksksm
    Hast recht, ich warte ab ;)

    Viele Grüße,
    Duster
    ? Ich kapier's grad nicht. Ich öffne das Projekt aus Post#1, nehme Form1 her, zieh mir aus der Toolbox das UserControl und fertig. Was ist daran dann falsch?

    Außerdem ist Dein Erstellungscode falsch. Du willst wohl eher nicht ein Label Deinem UserControl hinzufügen, sondern ein UserControl dem Formular:

    VB.NET-Quellcode

    1. Dim ctrl = New MyControl
    2. ctrl.Location = New Point(250, 15)
    3. ctrl.Visible = True
    4. Me.Controls.Add(ctrl)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi VaporiZed,

    den auskommentierten Code hatte ich vergessen rauszunehmen, klar der ist falsch.

    Der Punkt ist, dass ich das Control nicht aus der Toolbox ziehen will sondern es per Code auf die Form legen will da es in meinem Hauptprojekt an dem ich arbeite sehr viele Formen mit gleichartigen Controls gibt.
    Zu diesem Zwech habe ich mir benutzerdefinierte Controls erstellt.
    Diese sollen in einer Klasse wie GUI_cls erstellt werden.
    Ich möchte später kein Erstellungsgedöns in einer Form sondern nur noch eine Klasse einbinden (z.B. GUI_cls).
    Dann nur noch sowas wie Objekt.SetControl(Werte wie Größe, Text, Positio) etc.!

    Vielleicht trägt das zum Verständnis meiner Frage bei:

    VB.NET-Quellcode

    1. Public Class FrmStart
    2. Private Sub FrmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim ctrl = New MyControl
    4. Me.Controls.Add(ctrl)
    5. End Sub
    6. End Class


    Führe ich den obigen Code aus, dann funktioniert das ganze.
    Ich möchte diesen Code aner in die GUI_cls vershieben.
    D.H, ich muss bei

    VB.NET-Quellcode

    1. CMe.Controls.Add(....)
    auf die Form FrmStart zugreifen also

    VB.NET-Quellcode

    1. FrmStart.Controls.Add(....)
    , aber genau das funktioniert nicht!
    [/vbnet]


    VB.NET-Quellcode

    1. Public Class GUI_cls
    2. 'Code um Contol auf eine beliebige Form zu legen
    3. Dim ctrl = New MyControl
    4. ????.Controls.Add(ctrl)
    5. End Class





    Viele Grüße,
    Duster

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Duster“ ()

    Nein, das geht so nicht. Siehe: Dialoge richtig instanziieren
    Du müsstest das Form als Parameter an die Klasse übergeben.

    VB.NET-Quellcode

    1. Public Class FrmStart
    2. Private Sub FrmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim ctrl = New MyControl
    4. ctrl.AddTo(Me)
    5. End Sub
    6. End Class

    VB.NET-Quellcode

    1. Public Class GUI_cls
    2. Public Sub AddTo(Form As Form)
    3. Form.Controls.Add(Me)
    4. End Sub
    5. End Class
    Ein UserControl innerhalb der UserControl-Klasse zu erstellen ist so nicht möglich. Ggf. mit ner Singleton-Pattern-Factory. Aber sonst? Woher soll die Klasse auch sonst wissen, in welchem Zusammenhang sie mit welchem Formular genutzt wird?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ja gut, dann eben

    VB.NET-Quellcode

    1. Public Class FrmStart
    2. Private Sub FrmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim GUI_cls = New GUI_cls
    4. GUI_cls.AddControlTo(Me)
    5. End Sub
    6. End Class
    7. Public Class GUI_cls
    8. Public Sub AddControlTo(Form As Form)
    9. Dim MyCE As New MyControl
    10. Form.Controls.Add(MyControl)
    11. End Sub
    12. End Class


    Was soll das mit Events zu tun haben? Events sind, wenn ein Objekt sagt: »Hier, ich hänge eine neue Nachricht mit mehr oder weniger interessanten Infos ans schwarze Brett. Ob sich jemand dafür interessiert, geht mich nix an.«
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Duster Willkommen im Forum. :thumbup:
    Zunächst wäre es gut, wenn Dein angehängter Code compilieren würde.
    Verstehe den Post #4 vom @ErfinderDesRades .


    Da ziehst Du den relevanten Code heraus und passt die .Location an:

    VB.NET-Quellcode

    1. Public Class FrmStart
    2. Private WithEvents MyControl2 As MyControl
    3. Private Sub FrmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Me.MyControl2 = New MyControl()
    5. Me.MyControl2.Font = New Font("Arial", 13.8!, FontStyle.Regular, GraphicsUnit.Point, CType(0, Byte))
    6. Me.MyControl2.Location = New Point(14, 100)
    7. Me.MyControl2.Size = New Size(427, 56)
    8. Me.Controls.Add(Me.MyControl2)
    9. End Sub
    10. End Class
    und feddich:

    Das obere Control ist dsas aus dem Designer, das untere das in der Form_Load.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!