Addhandler -ohne "sub"

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von sacrificeXsteel.

    Addhandler -ohne "sub"

    Hallo
    Habe folgendes problem. ich will bei meinen Programm vom user beliebige viele Buttons mit unterschiedlichen Befehlen einfügen lassen. Das Einfügen funktioniert schon gut aber "Addhandler" geht nur wenn man schon ein Sub definiert hat oder ? denn bei den Code:
    Public Class Einstellungen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim ort As String = TextBox1.Text
    3. Dim btn As Button = New Button
    4. btn.Text = TextBox1.Text
    5. btn.Location = New Point(MaskedTextBox1.Text, MaskedTextBox2.Text)
    6. btn.Size = New Size(40, 40)
    7. AddHandler btn.Click, AddressOf new_Click
    8. Me.Controls.Add(btn)
    9. End Sub
    10. Private Sub Einstellungen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. End Sub
    12. End Class

    Muss eben new_click vorher in eine Private sub schreiben und das will ich eben autmatisch machen lassen. Hat irgendwer eine Idee wie das gehen könnte ?
    Hab jetzt ein wenig rumprobiert, komme aber nicht darauf wie ich den Code einsetzen kann ?( . Denn ich will das der user den Pfad von einen Programm angibt und dieser Pfad dann mit den shell() befehl in eine neue sub kommt da er ebene bis zu 10 verschiedene Buttons mit unterschiedlichen Programm Verknüpfungen machen könnnen soll.
    Ich hab den Code mal etwas angepasst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Grp As GroupBox
    3. Dim intAnzahl As Integer = 26
    4. Dim Btn(intAnzahl) As Button
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. 'GroupBox erstellen
    7. Grp = New GroupBox
    8. Controls.Add(Grp)
    9. Grp.Parent = Me
    10. Grp.Name = "grpGrp1"
    11. Grp.Location = New Point(20, 20)
    12. Grp.Size = New Size(320, 240)
    13. Grp.Text = ""
    14. Dim btnXpos As Integer = 30
    15. Dim btnYpos As Integer = 12
    16. For i As Integer = 0 To intAnzahl
    17. Btn(i) = New Button
    18. Controls.Add(Btn(i))
    19. Btn(i).Parent = Grp
    20. Btn(i).Name = "btn" & i.ToString
    21. Btn(i).Text = "Button " & i.ToString
    22. Btn(i).Size = New Size(80, 22)
    23. Btn(i).Location = New Point(btnXpos, btnYpos)
    24. btnXpos += 90 : If btnXpos > 250 Then btnXpos = 30 : btnYpos += 25
    25. AddHandler Btn(i).Click, AddressOf Btn_Click
    26. Next
    27. End Sub
    28. Dim ButtonNummer As Integer
    29. Private Sub Btn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    30. Dim ButtonFullName As String = DirectCast(sender, Button).Name.ToString
    31. Dim ButtonNameSplitted() As String = ButtonFullName.Split(CChar("n")) 'Unterteile den String ab "n"
    32. MsgBox(ButtonNameSplitted(0)) ' Erster Teil: uninteressant
    33. MsgBox(ButtonNameSplitted(1)) 'Zweiter Teil: der Index, den man nun zur Adressierung benutzen kann..
    34. ButtonNummer = CInt(ButtonNameSplitted(1))
    35. StarteProgrammX()
    36. End Sub
    37. Private Sub StarteProgrammX()
    38. Select Case ButtonNummer
    39. Case 0
    40. '... Aktion für Button 0
    41. MsgBox("Tue dies..")
    42. Case 1
    43. MsgBox("Tue jenes..")
    44. Case 2
    45. '... Aktion für Button 2
    46. MsgBox("oder dies..")
    47. Case Else
    48. MsgBox("Beim Rest mache immer das gleiche..")
    49. End Select
    50. End Sub
    51. End Class

    Bin zwar net ganz sicher, ob ich dein Vorhaben begreife, aber vielleicht bringt dich das ja weiter.

    //
    (Hab zwar grad das Gefühl, das es auch einfacher geht, aber hab keine Zeit zum Optimieren.)

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

    @Unwesen: And @sacrificeXsteel: ... benutzt dafür die Tag-Eigenschaft des Buttons ... somit ist der Buttonname egal und der Wert eindeutig ;)
    Button.Tag = deine Variable irgendeiner Klasse
    da Tag vom Typ Object ist kann da alles rein ... du musst den Wert da nur mit CType wieder in den richtigen Typ konvertieren (wenn dein Typ Integer oder String o.Ä. ist kannst du auch CStr, CInt, CDbl, etc. verwenden)