Dynamisch erstellte Buttons einzeln abfragen ob das Klick ereignis eingetreten ist

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Renati.

    Dynamisch erstellte Buttons einzeln abfragen ob das Klick ereignis eingetreten ist

    Liebe Programmierkollegen
    Ich habe ein problem beim abrufen des Click events von Dynamisch erzeugten Buttons.
    Mein Code sieht so aus:
    Dim Button1 As Button
    dim zahl as integer
    .
    .
    zahl + = 1
    Button1 = New Button
    Button1.Text = "Test"
    Button1.name = zahl
    .
    AddHandler Button1.Click, AddressOf Button1_click
    Me.Controls.add(Button1)
    .
    .
    .
    Privat Sub Button1_click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    End Sub

    Mein Problem ist, dass wenn ich jetzt in das Button1.click ereignis etwas hineinschreibe und mehrere Buttons dynamisch erzeugt habe alle Button den selben namen haben, obwohl ihnen unterschiedliche zugewiesen wurden. Ich glaube es liegt an der globalen Variablen deklaration. Allerdings funktioniert es ohne die nicht.
    Bitte um Hilfe und bedanke mich im Vorhinein!
    Laurenz :)
    Leider ist das Problem damit nicht gelöst. Wenn ich durch den Namen jetzt zum Beispiel sagen will, dass der Button mit dem Namen 3 beim Klickevent eine MSGBOX öffnen soll und der Button mit dem Namen 2 eine andere Form öffnen soll funktioniert es nicht. Beide Buttons führen zu dem Ereignis welches zuletzt "einprogrammiert" wurde
    Trotzdem danke für die schnelle Antwort. :)
    Frage in deiner ClickEventProzedur den Namen des Buttons ab, der als Sender übergeben wird.
    Abhängig von diesem reagierst du dann unterschiedlich

    Gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!

    Laurenz schrieb:

    Wenn ich durch den Namen jetzt zum Beispiel sagen will, dass der Button mit dem Namen 3 beim Klickevent eine MSGBOX öffnen soll und der Button mit dem Namen 2 eine andere Form öffnen soll funktioniert es nicht.

    Es ist einfach keine gute Idee, 2 Buttons mit so verschiedenen Aufgaben auf denselben EventHandler zu leiten.
    IMO ist es schon keine gute Idee, die Buttons ühaupt dynamisch zu erstellen.

    Im Designer könntestese schön beschriften, benamen, bebildern, in der Größe zurechtziehen, docken... - designen eben.

    Und per Doppelklick täte jeder seinen eigenen Click-Handler bekommen, was sie ja scheinbar auch brauchen.

    Frage: Wieso erstellst du die Buttons dynamisch?

    Re: Warum erstelle ich die Buttons dynamisch

    Mein programm sollte während der Laufzeit durch klick auf einen Button einen Button in einer Anderen Form erstellen... es ist glaube ich das beste wenn ich jetzt meinen ganzen Code zeige:
    Public Class Form1
    Dim aktuelleForm As Form
    Dim HinzuButton As Button
    Dim WithEvents frm As New Form
    Dim WithEvents Buttonhinzufügen As New Button
    Dim WithEvents ButtonX As New NumericUpDown
    Dim WithEvents buttonY As New NumericUpDown
    Dim WithEvents Buttontext As New TextBox
    Dim ausgewählt As Boolean = True
    Dim MausX, MausY As Integer
    Dim WithEvents Formhinzufügen As New Button
    Dim WithEvents Bewegen As New Button
    Dim WithEvents textboxhinzufügen As New Button
    Dim nachricht As String
    Dim ausgewähltezahl As Integer
    Dim WithEvents auszuwählendesereignis As New ComboBox
    Dim ButtongrößX As New NumericUpDown
    Dim ButtongrößY As New NumericUpDown
    Private Function GetAktuelleForm()

    End Function
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    auszuwählendesereignis.Items.Add("Nachricht_anzeigen")
    auszuwählendesereignis.Items.Add("Form_deaktivieren")
    auszuwählendesereignis.Items.Add("Button_deaktivieren")



    ButtongrößY.Maximum = 585
    ButtongrößX.Maximum = 884
    buttonY.Maximum = 585
    ButtonX.Maximum = 884

    Buttonhinzufügen.Text = "Button hinzufügen"
    Formhinzufügen.Text = "Form hinzufügen"
    Bewegen.Text = "<>"
    textboxhinzufügen.Text = "Textbox hinzufügen"
    Buttontext.Text = "Text"

    ButtongrößX.Width = 65
    ButtongrößY.Width = 65
    Buttonhinzufügen.Width = 155
    ButtonX.Width = 65
    buttonY.Width = 65
    Buttontext.Width = 155
    Formhinzufügen.Width = 113
    Bewegen.Width = 40
    textboxhinzufügen.Width = 155
    auszuwählendesereignis.Width = 155

    ButtongrößX.Location = New Point(12, 82)
    ButtongrößY.Location = New Point(83, 82)
    Buttontext.Location = New Point(12, 108)
    Buttonhinzufügen.Location = New Point(20, 27)
    ButtonX.Location = New Point(12, 62)
    buttonY.Location = New Point(83, 62)
    Formhinzufügen.Location = New Point(20, 2)
    Bewegen.Location = New Point(135, 2)
    textboxhinzufügen.Location = New Point(12, 160)
    auszuwählendesereignis.Location = New Point(12, 128)

    Me.Controls.Add(ButtongrößY)
    Me.Controls.Add(ButtongrößX)
    Me.Controls.Add(Buttontext)
    Me.Controls.Add(buttonY)
    Me.Controls.Add(ButtonX)
    Me.Controls.Add(Buttonhinzufügen)
    Me.Controls.Add(Formhinzufügen)
    Me.Controls.Add(Bewegen)
    Me.Controls.Add(textboxhinzufügen)
    Me.Controls.Add(auszuwählendesereignis)

    frm.TopLevel = False
    frm.Visible = True

    Panel1.Controls.Add(frm) 'Die neue Form wird in dem Panel hinzugefügt

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim Button1 As New Button
    Button1.Location = New Point(ButtonX.Value, buttonY.Value)
    Button1.Size = New Size(ButtongrößX.Value, ButtongrößY.Value)
    Button1.Text = Buttontext.Text 'em Button werden die eigenschaften zugewiesen
    frm.Controls.Add(Button1) 'Der Button wird der Form frm hinzugefügt
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Buttonhinzufügen.Location = New Point(MausX, MausY) 'Hier wird die Position des Buttons berechnet
    ButtonX.Location = New Point(MausX, MausY + 30)
    buttonY.Location = New Point(MausX + 73, MausY + 30)
    Buttontext.Location = New Point(MausX - 8, MausY + 81)
    Formhinzufügen.Location = New Point(MausX, MausY - 25)
    Bewegen.Location = New Point(MausX + 115, MausY - 25)
    textboxhinzufügen.Location = New Point(MausX - 8, MausY + 133)
    auszuwählendesereignis.Location = New Point(MausX - 8, MausY + 110)
    ButtongrößX.Location = New Point(MausX, MausY + 55)
    ButtongrößY.Location = New Point(MausX + 73, MausY + 55)
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    MausX = e.X 'Hier erhält man die Mauskoordinaten für das verschieben des Buttons
    MausY = e.Y
    End Sub





    Private Sub Formhinzufügen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Formhinzufügen.Click
    frm = New Form
    Try
    frm.TopLevel = False
    frm.Visible = True

    Panel1.Controls.Add(frm) 'Die neue Form wird in dem Panel hinzugefügt
    Catch
    MsgBox("Sie haben bereits eine Form!")
    End Try

    End Sub

    Public Sub Buttonhinzufügen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Buttonhinzufügen.Click

    HinzuButton = New Button
    AddHandler HinzuButton.Click, AddressOf HinzuButton_click
    If auszuwählendesereignis.SelectedItem = "Nachricht_anzeigen" Then
    HinzuButton.Name = auszuwählendesereignis.SelectedItem & ";" & nachricht
    ElseIf auszuwählendesereignis.SelectedItem = "Form_deaktivieren" Then
    HinzuButton.Name = auszuwählendesereignis.SelectedItem

    ElseIf auszuwählendesereignis.SelectedItem = "Button_deaktivieren" Then
    HinzuButton.Name = auszuwählendesereignis.SelectedItem
    End If

    HinzuButton.Text = Buttontext.Text
    HinzuButton.Location = New Point(ButtonX.Value, buttonY.Value)
    frm.Controls.Add(HinzuButton)
    Dim Menü As New ContextMenuStrip

    End Sub
    Private Sub HinzuButton_click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim b As Button = DirectCast(sender, Button)
    Dim array As String()
    array = HinzuButton.Name.Split(";")
    If b.Name = "Nachricht_anzeigen;" & nachricht Then
    MsgBox(array(1))
    Else
    MsgBox(array(1))
    End If


    If array(0) = "Nachricht_anzeigen" Then

    End If
    If HinzuButton.Name = "Form_deaktivieren" Then
    frm.Enabled = False
    ElseIf HinzuButton.Name = "Button_deaktivieren" Then
    HinzuButton.Enabled = False

    End If








    End Sub
    Private Sub TextBo____lick(ByVal sender As System.Object, ByVal e As System.EventArgs)
    MsgBox("Es funktioneiret")
    End Sub


    Private Sub Bewegen_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Bewegen.KeyDown
    If ausgewählt = True Then
    Timer1.Start()
    ausgewählt = False
    Else
    ausgewählt = True
    Timer1.Stop()
    End If
    End Sub

    Private Sub textboxhinzufügen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles textboxhinzufügen.Click

    Dim textbox1 As New TextBox
    AddHandler textbox1.Click, AddressOf TextBo____lick

    textbox1.Text = Buttontext.Text
    textbox1.Location = New Point(ButtonX.Value, buttonY.Value)
    frm.Controls.Add(textbox1)
    Dim Menü As New ContextMenuStrip
    End Sub



    Private Sub auszuwählendesereignis_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles auszuwählendesereignis.SelectedIndexChanged
    If auszuwählendesereignis.SelectedItem = "Nachricht_anzeigen" Then
    nachricht = InputBox("Was soll angezeigt werden")
    End If

    End Sub
    End Class
    Ich weiß es ist sehr schlecht programmiert :whistling: , aber ich wollte mal ein kleines "Klick" programm schreiben, indem der User ein kleines programm ohne programmierkenntnisse schreiben kann. ^^

    Re: Code wüste

    Der Benutzer soll zur Laufzeit dynamisch Buttons und Textboxen erstellen und ihnen Ereignisse zuweisen können, wie zum Beispiel das Klick ereignis beim Button. Und damit jeder dynamisch erzeugte Button ein eigenes Ereignis bekommt muss es unterscheidungsmerkmale, wie zum Beispiel den Namen geben. Doch wenn ich den Namen zuweise, wie im kurzen Beispiel oben zu sehen, bekomme ich das Problem, dass der Namen allen Button zugewiesen wird.
    Vielen dank für die Zeit die Sie sich für das lesen und antworten von meinen Beiträgen machen. Ich möchte mich für diese "Code wüste" entschuldigen, muss allerdings sagen, dass ich das Problem nicht formulieren konnte.
    Lg Laurenz
    Mir scheint, du willst den User ein bischen zum Programmierer machen. Aber das kann doch nur ganz rudimentär gelingen.
    Du wirst ja iwo eine Tabelle möglicher Methoden haben, und dann kann der User sichn Button basteln, und eine dieser Methoden damit verknüpfen.

    Wäres da nicht einfacher, der User wählt eine Methode, und du übernimmst die Erstellung und Gestaltung des Buttons für ihn?

    Oder in üblichen Customizing-Konzepten sind glaub alle ToolstripItems fertig vorbereitet, und das Customizing besteht darin, die Dinger sichtbar zu machen, oder mw. von einer Toolbar in die annere zu schieben oder sowas.

    Aber nicht neue Buttons erfinden, und funktionalität dafür zusammensuchen.

    Oder erklärmal dein Programm-Konzept genauer.
    Wo ist hier das Problem? picoflop hat die korrekte und vollständige Lösung bereits im zweiten Post angegeben. Einem kompetenten Mitglied dieses Forums darf man dann ruhig schon mal glauben.
    Das vorliegende Problem scheint viel mehr zu sein: Steuerelemente identifiziert man nicht durch ihren Namen. Der Name ist ein Zugriffsoperator - syntaktischer Zucker. Du wirst eine Datenstruktur benötigen (ein Dictionary, ...), die dir sagt, welcher Button welche Funktion auszuführen hat.
    Hallo erstmal
    1. Der Name besteht nur im kurzen erklähr code in dem orginalcode sieht der Name so aus, dass er angaben enthält, welches ereignis dem Button hinzugefügt wurde. Es gibt zum Beispiel das Eriegnis, dass die Form enabled = fals wird. Dann steht im Button namen "Form_deaktivieren"
    2. Danke für die Antwort von picoflop, allerdings habe ich das problem welches Renati bereits angeschnitten hatte, alles Buttons die hinzugefügt wurden haben den selben Namen.
    3. An ErfinderDesRades: Danke für die vielen Beiträge, allerdings soll der User nur den Text und die Location und das Clickereignis des Buttons in der Form festlegen
    Bilder
    • ScreenshotProgramm.PNG

      19,98 kB, 830×501, 472 mal angesehen
    • ScreenshotProgramm2.PNG

      13,39 kB, 542×304, 446 mal angesehen

    Danke für die Hilfe

    Vielen Dank an alle, die eifrig mitgeholfen haben dieses Projekt zu verwirklichen
    Ich habe mein Problem gefunden. Es lag an der auslesung von dem Namen des Buttons. Ich werde hier meinen Code, für alle die es interessiert einfügen
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim aktuelleForm As Form
    3. Dim WithEvents frm As New Form
    4. Dim WithEvents Buttonhinzufügen As New Button
    5. Dim WithEvents ButtonX As New NumericUpDown
    6. Dim WithEvents buttonY As New NumericUpDown
    7. Dim WithEvents Buttontext As New TextBox
    8. Dim ausgewählt As Boolean = True
    9. Dim MausX, MausY As Integer
    10. Dim WithEvents Formhinzufügen As New Button
    11. Dim WithEvents Bewegen As New Button
    12. Dim WithEvents textboxhinzufügen As New Button
    13. Dim nachricht As String
    14. Dim ausgewähltezahl As Integer
    15. Dim WithEvents auszuwählendesereignis As New ComboBox
    16. Dim ButtongrößX As New NumericUpDown
    17. Dim ButtongrößY As New NumericUpDown
    18. Private Function GetAktuelleForm()
    19. End Function
    20. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    21. auszuwählendesereignis.Items.Add("Nachricht_anzeigen")
    22. auszuwählendesereignis.Items.Add("Form_deaktivieren")
    23. auszuwählendesereignis.Items.Add("Button_deaktivieren")
    24. ButtongrößY.Maximum = 585
    25. ButtongrößX.Maximum = 884
    26. buttonY.Maximum = 585
    27. ButtonX.Maximum = 884
    28. Buttonhinzufügen.Text = "Button hinzufügen"
    29. Formhinzufügen.Text = "Form hinzufügen"
    30. Bewegen.Text = "<>"
    31. textboxhinzufügen.Text = "Textbox hinzufügen"
    32. Buttontext.Text = "Text"
    33. ButtongrößX.Width = 65
    34. ButtongrößY.Width = 65
    35. Buttonhinzufügen.Width = 155
    36. ButtonX.Width = 65
    37. buttonY.Width = 65
    38. Buttontext.Width = 155
    39. Formhinzufügen.Width = 113
    40. Bewegen.Width = 40
    41. textboxhinzufügen.Width = 155
    42. auszuwählendesereignis.Width = 155
    43. ButtongrößX.Location = New Point(12, 82)
    44. ButtongrößY.Location = New Point(83, 82)
    45. Buttontext.Location = New Point(12, 108)
    46. Buttonhinzufügen.Location = New Point(20, 27)
    47. ButtonX.Location = New Point(12, 62)
    48. buttonY.Location = New Point(83, 62)
    49. Formhinzufügen.Location = New Point(20, 2)
    50. Bewegen.Location = New Point(135, 2)
    51. textboxhinzufügen.Location = New Point(12, 160)
    52. auszuwählendesereignis.Location = New Point(12, 128)
    53. Me.Controls.Add(ButtongrößY)
    54. Me.Controls.Add(ButtongrößX)
    55. Me.Controls.Add(Buttontext)
    56. Me.Controls.Add(buttonY)
    57. Me.Controls.Add(ButtonX)
    58. Me.Controls.Add(Buttonhinzufügen)
    59. Me.Controls.Add(Formhinzufügen)
    60. Me.Controls.Add(Bewegen)
    61. Me.Controls.Add(textboxhinzufügen)
    62. Me.Controls.Add(auszuwählendesereignis)
    63. frm.TopLevel = False
    64. frm.Visible = True
    65. Panel1.Controls.Add(frm) 'Die neue Form wird in dem Panel hinzugefügt
    66. End Sub
    67. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    68. Dim Button1 As New Button
    69. Button1.Location = New Point(ButtonX.Value, buttonY.Value)
    70. Button1.Height = ButtongrößY.Value
    71. Button1.Width = ButtongrößX.Value
    72. Button1.Text = Buttontext.Text 'em Button werden die eigenschaften zugewiesen
    73. frm.Controls.Add(Button1) 'Der Button wird der Form frm hinzugefügt
    74. End Sub
    75. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    76. Buttonhinzufügen.Location = New Point(MausX, MausY) 'Hier wird die Position des Buttons berechnet
    77. ButtonX.Location = New Point(MausX, MausY + 30)
    78. buttonY.Location = New Point(MausX + 73, MausY + 30)
    79. Buttontext.Location = New Point(MausX - 8, MausY + 81)
    80. Formhinzufügen.Location = New Point(MausX, MausY - 25)
    81. Bewegen.Location = New Point(MausX + 115, MausY - 25)
    82. textboxhinzufügen.Location = New Point(MausX - 8, MausY + 133)
    83. auszuwählendesereignis.Location = New Point(MausX - 8, MausY + 110)
    84. ButtongrößX.Location = New Point(MausX, MausY + 55)
    85. ButtongrößY.Location = New Point(MausX + 73, MausY + 55)
    86. End Sub
    87. Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    88. MausX = e.X 'Hier erhält man die Mauskoordinaten für das verschieben des Buttons
    89. MausY = e.Y
    90. End Sub
    91. Private Sub Formhinzufügen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Formhinzufügen.Click
    92. frm = New Form
    93. Try
    94. frm.TopLevel = False
    95. frm.Visible = True
    96. Panel1.Controls.Add(frm) 'Die neue Form wird in dem Panel hinzugefügt
    97. Catch
    98. MsgBox("Sie haben bereits eine Form!")
    99. End Try
    100. End Sub
    101. Public Sub Buttonhinzufügen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Buttonhinzufügen.Click
    102. Dim HinzuButton As New Button
    103. If auszuwählendesereignis.SelectedItem = "Nachricht_anzeigen" Then
    104. HinzuButton.Name = auszuwählendesereignis.SelectedItem & ";" & nachricht
    105. ElseIf auszuwählendesereignis.SelectedItem = "Form_deaktivieren" Then
    106. HinzuButton.Name = auszuwählendesereignis.SelectedItem
    107. ElseIf auszuwählendesereignis.SelectedItem = "Button_deaktivieren" Then
    108. HinzuButton.Name = auszuwählendesereignis.SelectedItem
    109. End If
    110. AddHandler HinzuButton.Click, AddressOf HinzuButton_click
    111. HinzuButton.Text = Buttontext.Text
    112. HinzuButton.Location = New Point(ButtonX.Value, buttonY.Value)
    113. frm.Controls.Add(HinzuButton)
    114. Dim Menü As New ContextMenuStrip
    115. End Sub
    116. Private Sub HinzuButton_click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    117. Dim b As Button = DirectCast(sender, Button)
    118. Dim array As String()
    119. array = b.Name.Split(";")
    120. If b.Name = "Nachricht_anzeigen;" & nachricht Then
    121. MsgBox(nachricht)
    122. Else
    123. Try
    124. MsgBox(array(1))
    125. Catch
    126. End Try
    127. End If
    128. If b.Name = "Form_deaktivieren" Then
    129. frm.Enabled = False
    130. ElseIf b.Name = "Button_deaktivieren" Then
    131. b.Enabled = False
    132. End If
    133. End Sub
    134. Private Sub TextBo____lick(ByVal sender As System.Object, ByVal e As System.EventArgs)
    135. MsgBox("Es funktioneiret")
    136. End Sub
    137. Private Sub Bewegen_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Bewegen.KeyDown
    138. If ausgewählt = True Then
    139. Timer1.Start()
    140. ausgewählt = False
    141. Else
    142. ausgewählt = True
    143. Timer1.Stop()
    144. End If
    145. End Sub
    146. Private Sub textboxhinzufügen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles textboxhinzufügen.Click
    147. Dim textbox1 As New TextBox
    148. AddHandler textbox1.Click, AddressOf TextBo____lick
    149. textbox1.Text = Buttontext.Text
    150. textbox1.Location = New Point(ButtonX.Value, buttonY.Value)
    151. frm.Controls.Add(textbox1)
    152. Dim Menü As New ContextMenuStrip
    153. End Sub
    154. Private Sub auszuwählendesereignis_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles auszuwählendesereignis.SelectedIndexChanged
    155. If auszuwählendesereignis.SelectedItem = "Nachricht_anzeigen" Then
    156. nachricht = InputBox("Was soll angezeigt werden")
    157. End If
    158. End Sub
    159. End Class