Selbserstellte Controls (z.Bverschiedene Buttons) mit verschiedenen Events verbinden

  • VB.NET

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

    Selbserstellte Controls (z.Bverschiedene Buttons) mit verschiedenen Events verbinden

    Hallo zusammen :) ,

    ich habe ein kleines Problem mit der zuweisung dynamisch erstellter Controls an verschiedene Event. Genauer, ich erstelle 3 verschiedene Buttons (vergebe auch unterschiedliche Namen) und ein Click Event welches den String "Test" in eine dynamisch erstellte TextBox schreibt.

    1.Wenn ich das so wie es im Qelltext steht mache müsste ich eine TextBox mit Namen TxtBox aus der ToolBox erstellen.
    Bei einer dynamisch erzeugten TextBox funktioniert das nicht. Wie spreche ich die TxtBox korrekt an ?(

    2. Das Click-Event reagiert nur auf CmdButton, ich habe aber 3 Buttons mit unterschiedlichen Namen (CmdFunction, CmdSub, CmdSubByRef).
    Wie ordne ich jedem der 3 Buttons ein anderes Click-Event zu ?(

    Form Load:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim Ctrl As ControlService = New ControlService
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Ctrl.SetButton("CmdFunction", "Function", 350, 100, 30, 100)
    6. Ctrl.SetButton("CmdSub", "Sub", 350, 180, 30, 100)
    7. Ctrl.SetButton("CmdSubByRef", "Sub (ByRef)", 325, 260, 30, 150)
    8. Ctrl.SetTextBox("TxtBox_01", " ", 100, 100, 80, 200)
    9. End Sub
    10. End Class



    ControlService:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Windows.Forms.Control
    3. Public Class ControlService
    4. #Region "BUTTON"
    5. Public Sub SetButton(pName As String, pText As String, pLeft As Integer, pTop As Integer,
    6. pHeight As Integer, pWidth As Integer)
    7. Dim CmdButton = New Button
    8. With CmdButton
    9. .Name = pName
    10. .Text = pText
    11. .Left = pLeft
    12. .Top = pTop
    13. .Height = pHeight
    14. .Width = pWidth
    15. Form1.Controls.Add(CmdButton)
    16. End With
    17. AddHandler CmdButton.Click, AddressOf CmdButton_Click
    18. End Sub
    19. #End Region
    20. #Region "TEXTBOX"
    21. Public Sub SetTextBox(pName As String, pText As String, pLeft As Integer, pTop As Integer,
    22. pHeight As Integer, pWidth As Integer)
    23. Dim TxtBox = New TextBox
    24. With TxtBox
    25. .Name = pName
    26. .Text = pText
    27. .Left = pLeft
    28. .Top = pTop
    29. .Height = pHeight
    30. .Width = pWidth
    31. Form1.Controls.Add(TxtBox)
    32. End With
    33. End Sub
    34. #End Region
    35. #Region "EVENTS"
    36. Sub CmdButton_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    37. Form1.TxtBox.Text = "Test"
    38. End Sub
    39. #End Region
    40. End Class


    Vielen Dank für Eure Mühe und Hilfe vorab :!:

    Ich nutze VisualStudio 2019 Community Edition!
    Den Quellcode habe ich im 77zip-Format angehängt.

    Viele Grüße,
    Duster
    Dateien
    • Source.7z

      (147,54 kB, 146 mal heruntergeladen, zuletzt: )

    Duster schrieb:

    Das Click-Event reagiert nur auf CmdButton
    Nö. Alle Buttons lösen das gleiche Ereignis aus. Hast Du ja so festgelegt: Codeblock#2, Zeile#19.

    Das mit dem TextBox-Ansprechen geht deshalb nicht, weil Du festlegst, dass TxtBox von Form1 anvisiert werden soll. Diese TextBox gibt es aber zur Designzeit nicht. Erst später, zur Laufzeit. Und da legst Du auch nicht fest, dass das Ding TxtBox heißt, sondern pName - was auch immer da dann als Namensparameter übergeben wird. Wie in dem anderen Thread schon geschrieben: Die ControlService-Klasse sollte nicht versuchen Form1 zu manipulieren! Darum sollte sich Form1 selber kümmern. Daher wäre es besser, wenn die ControlServiceklasse einen neuen Button am Ende von SetButton zurückgibt, aber nicht selber diesen Button den Controls von Form1 hinzufügt. Das sollte Form1 selber machen.
    Das mit unterschiedlichen Events pro Button. Du kannst neben Name, Beschriftung, Größe und Position auch einen Prozedurnamen übergeben. Diese Prozedur kann dann aufgerufen werden, wenn der Button geklickt wird. Das geht dann so:

    VB.NET-Quellcode

    1. 'in Form1
    2. Ctrl.SetButton("CmdFunction", "Function", 350, 100, 30, 100, AddressOf ClickEventHandlerForCmdFunction)
    3. '...
    4. Private Sub ClickEventHandlerForCmdFunction(sender As Object, e as EventArgs)
    5. 'wasauchimmer beim Klick von CmdFunction passieren soll
    6. End Sub
    7. 'in der ControlService-Klasse
    8. Public Sub SetButton(pName As String, pText As String, pLeft As Integer, pTop As Integer,
    9. pHeight As Integer, pWidth As Integer, ClickHandler As EventHandler)
    10. Dim CmdButton = New Button
    11. With CmdButton
    12. .Name = pName
    13. '...
    14. AddHandler .Click, ClickHandler
    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 schrieb:

    VB.NET-Quellcode

    1. Form1.Controls.Add(CmdButton)
    Hatten wir eben: Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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!

    Duster schrieb:

    ...dynamisch erstellter Controls [...] dynamisch erstellte TextBox...
    Controls sind eiglich nicht primär dafür vorgesehen, dynamisch erstellt zu werden.
    Meist hat man einen Denkfehler inne Anwendungs-Architektur, wenn man auf solche Gedanken kommt.

    Wieso denkst du, deine Controls dynamisch erstellen zu müssen, anstatt sie einfach aus der Toolbox aufs Form zu ziehen?
    Weil solch bringt allerlei Schwierigkeiten - die hiesige ist nur eine vons das.
    Also wenn du dein derzeitiges Problem gelöst hast, ist hochwahrscheinlich, dass du mittelfristig in anderen Hinsichten auch wieder vor Baum fährst.
    @Duster indem Dir Deine Probleme über den Kopf wachsen und Deine Anforderungen an das Forum steigen und man Dir ggf. nicht mehr helfen kann oder will.
    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!
    @Duster Je größer das Programm, um so restriktiver muss die Entwicklung sein, sonst landest Du bei Kraut und Rüben.
    Ein gutes Ordnungskonzept trägt dabei wesentlich zur Pflegbarkeit eines Projekts bei.
    Ich hatte ein Projekt, da wurden wellenlängenabhängige Messungen im sichtbaren Licht gemacht.
    Da hab ich zur Darstellung der Farben ein TableLayoutPanel mit einer variablen Anzahl an Spalten genommen und dynamisch in die einzelnen Spalten je ein Panel mit der entsprechenden Hintergrundfarbe gepackt.
    ====
    Wenn Du so was angehst, erstell das zunächst im Designer und schreib dann den relevanten Code aus der FormX.Designer.vb-Datei ab.
    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!