UserControl dynamisch in Panel einfügen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von newVBUserXX.

    UserControl dynamisch in Panel einfügen

    Hallo zusammen,
    Ich habe mir ein Split Panel aufgebaut. In diesem rufe ich verschieden UserControls auf. Diese werden über Buttons aktiviert. Das funktioniert so weit.

    Me.SplitContainer1.Panel2.Controls.Clear()
    Dim UsCo_Personalverwaltung AsNewUsCo_Büro_Personalverwaltung

    SplitContainer1.Panel2.Controls.Add(UsCo_Personalverwaltung)



    mein Problem:
    wie kann ich das UserControl als "String" angeben? Ich will es dynamisch hinzu fügen



    Danke,
    Frank
    Hier mal ein Beispiel wie man einen Button zur Laufzeit erstellt.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim MeinButton As New Button
    4. With MeinButton
    5. ' ab hier könnt ihr sämtliche Eigenschaften des Steuerelements (In dem Fall Button) ändern. Zb.
    6. .Text = "Klick Mich Mal" ' Text
    7. .BringToFront() ' Im Vordegrund starten
    8. .ForeColor = Color.Black 'TextFarbe
    9. .Width = 150 ' Breite
    10. .Height = 40 ' Höhe
    11. .Left = 100 ' Abstand vom linken Rand
    12. .Top = 100 ' Abstand vom oberen Rand
    13. ' Man kann noch viel mehr Eigenschaften ändern Einfach mal ausprobiren
    14. AddHandler .Click, AddressOf ButtonKlick ' Mit AddHandler weist ihr das Event einem Handler zu
    15. ' um später darauf zugreifen zu können ( Hier zb. ClickEvent )
    16. Me.Controls.Add(MeinButton) ' Me Controlls.Add bringt den Butten auf Eure Form
    17. End With
    18. End Sub
    19. ' Hier kommt das rein was beim ButtoklickEvent passieren soll, in dem Fall MsgBox
    20. Private Sub ButtonKlick(ByVal sender As System.Object, ByVal e As System.EventArgs)
    21. MessageBox.Show("Klick")
    22. End Sub
    23. End Class

    Dann wie du bereits geschrieben hast.
    zum Control (Panel2) ADD

    Das Sollte mit deinem Control auch so funktionieren.
    Danke für die schnelle Antwort, wie es mit einem Button war mir bekannt.
    Ich versuche aber ein bestehendes UserControl aufzurufen.
    Derzeit mache ich es ja so:
    Dim UsCo_Personalverwaltung AsNew UsCo_Büro_Personalverwaltung
    SplitContainer1.Panel2.Controls.Add(UsCo_Personalverwaltung)

    Der Name des UserControl (rot markiert) soll ein string sein, da ich je Fall verschieden aufrufen will.


    Frank
    Da musst Du die Erstellung dieses Controls in eine Select Case(NAME_AS_STRING reinpacken, dass am Ende ein UserControl-Object rauskommt.
    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!
    Hier mal ein Beispiel von mir eventuell hilft es Dir ja:

    VB.NET-Quellcode

    1. #Region "Deklaration"
    2. ' contAllgemein wäre der Name meines UserControls
    3. Private contallg As New contAllgemein
    4. #End Region
    5. 'Aufruf erfolgt durch einen Click-Event
    6. 'mein UserControl wird in einem Panel (contentPanel) angezeigt
    7. Private Sub TabStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles TabStrip1.ItemClicked
    8. If tabAllg.Selected = True Then
    9. contentPanel.Controls.Clear()
    10. contentPanel.Controls.Add(contallg)
    11. End If
    12. End Sub


    Gruß
    IchWars

    VB.NET-Quellcode

    1. Dim uc As New UsCo_Büro_Personalverwaltung

    Wo ist hier ein String?
    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!
    das rote markierte soll ein string sein.

    Dim UsCo_Personalverwaltung As New UsCo_Büro_Personalverwaltung
    SplitContainer1.Panel2.Controls.Add(UsCo_Personalverwaltung)


    --> ich will das letze aufgerufene usc beim beenden von meinem Programm in den settings abspeichern und beim nächsten mal öffnen des Programme soll das gleiche usc wieder geöffent sein.

    newVBUserXX schrieb:

    Dies will ich über einen "string" machen.

    Das ist einfach eine schlechte Idee.

    Besser dieser Ansatz:
    Du hast sicherlich verschiedene buttons für die verschiedenen Funktions-Module deiner Anwendung. Jo, und im Click-Event des einen buttons packst du halt ein uclVerwalteKunde ins SplitPanel, und im Click-Event des anneren Buttons packste ein uclMobDenKollegen da rein.

    Das ist doch nicht abhängig von iwelchen Strings, sondern davon, welcher Button geklickst wurde. Welcher Button geklickst wurde, erfährt man über den Sender des Click-Events - du kannst mal Alles über Events durchwühlen, an ieiner Stelle wird zB. ein ganzes Menü in einer Methode behandelt.

    Edit: ah, ja:
    --> ich will das letze aufgerufene usc beim beenden von meinem Programm in den settings abspeichern und beim nächsten mal öffnen des Programme soll das gleiche usc wieder geöffent sein.

    mach SplitPanel2.Controls(0).Gettype.Name - dann haste einen eindeutigen String.

    newVBUserXX schrieb:

    das rote markierte soll ein string sein.
    Ein String ist aber kein UserControl.
    Frage:
    Welche Strings stehen denn zur Auswahl?
    Erzeugst Du ggf. mehrere verschiedene UserControls?
    Dann mach es so:

    RodFromGermany schrieb:

    Da musst Du die Erstellung dieses Controls in eine Select Case(NAME_AS_STRING reinpacken, dass am Ende ein UserControl-Object rauskommt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Class UserControlBase
    2. End Class
    3. Class UserControlA
    4. Inherits UserControlBase
    5. End Class
    6. Class UserControlB
    7. Inherits UserControlBase
    8. End Class
    9. Dim uc As UserControlBase
    10. Select Case (DEIN_STRING_ZUR_UNTERSCHEIDUNG)
    11. Case "A": uc = UserControlA
    12. Case "B": uc = UserControlB
    13. ' usw.
    14. End Select

    Oder benötigst Du nur einen String-Parameter, den Du im Konstruktor übergeben kannst?

    VB.NET-Quellcode

    1. Dim uc As New UsCo_Büro_Personalverwaltung(DEIN_STRING_ZUR_UNTERSCHEIDUNG)
    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!
    ich habe es jetzt so gelöst:

    VB.NET-Quellcode

    1. Dim lastWindow As String
    2. lastWindow = My.Settings.Setting_StartWindow
    3. If lastWindow = "UsCo_1" Then
    4. Dim UsCo_1 As New UsCo_1
    5. SplitContainer1.Panel2.Controls.Add(UsCo_1)
    6. ElseIf lastWindow = "UsCo_2" Then
    7. Dim UsCo_2 As New UsCo_2
    8. SplitContainer1.Panel2.Controls.Add(UsCo_2)
    9. ElseIf lastWindow = "UsCo_3" Then
    10. Dim UsCo_3 As New UsCo_3
    11. SplitContainer1.Panel2.Controls.Add(UsCo_3)
    12. ElseIf lastWindow = "UsCo_4" Then
    13. Dim UsCo_4 As New UsCo_4
    14. SplitContainer1.Panel2.Controls.Add(UsCo_4)
    15. ElseIf lastWindow = "UsCo_5" Then
    16. Dim UsCo_5 As New UsCo_5
    17. SplitContainer1.Panel2.Controls.Add(UsCo_5)
    18. End If
    Hab ich doch gleich gesagt. Und da alle eine gemeinsame Basisklasse haben, kannst Du Deinen Code noch drastisch verkürzen und lesbar machen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim lastWindow As String = "kjkj"
    3. Dim us As UserControl
    4. Select Case lastWindow
    5. Case "UsCo_1" : us = New UsCo_1
    6. Case "UsCo_2" : us = New UsCo_2
    7. Case "UsCo_3" : us = New UsCo_3
    8. Case "UsCo_4" : us = New UsCo_4
    9. Case "UsCo_5" : us = New UsCo_5
    10. Case Else
    11. Debug.Assert(False)
    12. Return
    13. End Select
    14. SplitContainer1.Panel2.Controls.Add(us)
    15. End Sub
    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!