Dynamisches Ansprechen von Buttons

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ๖̶̶̶ζ͜͡Climbtexes.

    Dynamisches Ansprechen von Buttons

    Hallo Community,

    ich bräuchte etwas hilfe bei einem Programmier-projekt:
    Grob gesagt, soll es ein Schiffe-versenken werden mit 10x10 Feldern.

    Diese haben alle eine Bezeichnung von z.B. field_A3 oder field_H7.

    Nun möchte einzelnen von ihnen zum Beispiel einen anderen Hintergrund geben
    und dabei die Koordinaten mit variablen ersetzen. Ich hatte an sowas hier gedacht:

    Quellcode

    1. Me.Controls("field_A" & "1").BackColor = Color.Red


    Ich habe es auch schon (wie hier im Forum an manchen stellen beschrieben) mit Arrays gearbeitet, aber dabei bekomme ich dauernd Fehler.

    Gibt es einen Weg den Buttonnamen so über Variablen zusammenzusetzen?

    Mit freundlichen Grüßen
    ๖̶̶̶ζ͜͡Climbtexes
    Dein Konzept ist Überdenkens Wert.
    Hier was zum nachdenken:

    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click
    2. Dim btn As Button = DirectCast(sender, Button)
    3. ResetButtonColor(Color.Green)
    4. btn.BackColor = Color.Red
    5. End Sub
    6. Private Sub ResetButtonColor(col As Color)
    7. For Each btn As Button In Me.Controls
    8. btn.BackColor = col
    9. Next
    10. End Sub

    BTW
    Controls, und somit auch der Button, habe eine Tag Eigenschaft, da könnte man "A1" rein schreiben. ;O)
    ​Dein Konzept ist Überdenkens Wert.

    Meinst du damit die vielen buttons? Falls ja, mir ist keine bessere möglichkeit eingefallen
    (hab auch schon was mit mausklick-koordinaten gemacht, jedoch müsste ich dann in diesen Feldern irgendwas anzeigen, was mir nicht gelingen wollte)


    Das mit den Tags hört sich super an, danke.

    muss ich den jetzt diesem Sub alle meine 100 Buttons als click-event hinzufügen oder geht das auch effizienter?
    Du stellst die richtigen Fragen. :thumbsup:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. RegisterButtons()
    3. End Sub
    4. Private Sub RegisterButtons()
    5. For Each btn As Button In Me.Controls
    6. AddHandler btn.Click, AddressOf Button_Click
    7. Next
    8. End Sub
    9. Private Sub Button_Click(sender As Object, e As EventArgs)
    10. Dim btn As Button = DirectCast(sender, Button)
    11. ResetButtonColor(Color.Green)
    12. btn.BackColor = Color.Red
    13. End Sub
    14. Private Sub ResetButtonColor(col As Color)
    15. For Each btn As Button In Me.Controls
    16. btn.BackColor = col
    17. Next
    18. End Sub
    Willkommen im Forum.

    Sicherlich könnte man auch was mit nem DGV machen, Stichwort DGV-ButtonColumn. Oder nem TableLayoutPanel. Bei letzterem hat ja jedes Control auch Table-Koordinaten.
    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.
    @๖̶̶̶ζ͜͡Climbtexes Ebenfalls: Willkommen im Forum. :thumbup:
    Zum Schiffe versenken genügt bei Deinen Kenntnissen ein TableLayoutPanel.
    Ggf. paclst Du in die Zellen je ein Panel, Buttons brauchst Du da nicht.
    Mit dem Klick auf das jeweilige Feld kannst Du auch dessen Properties ändern, und die Koordinaten (Zeile, Spalte) sind ja dem Control bekannt, wie bereits @VaporiZed schrieb.
    ====
    Mach ruhig nacheinander mehrere Ansätze in je einem neuen Projekt, um die Möglichkeiten zu erkunden.
    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!