Visual Basic 2010 Express Abfragen welcher Button gedrückt wurde

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Visual Basic 2010 Express Abfragen welcher Button gedrückt wurde

    Hallo liebe Community,

    ich habe da ein Problem!
    Undzwar habe ich eine Form mit 7 Buttons.. Nun möchte ich nur wissen welcher dieser Buttons gedrückt wurden. Doch darran verzweifliche ich gerade :|
    Ich denke es würde mit Select case funktionieren aber ich möchte es nicht mit Select case machen. Es gibt doch bestimmt eine andere Methode um es zu ermöglichen doch wie?

    Danke im vorraus! :)
    @ClonkAndre so was:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click
    2. If sender.Equals(Button1) Then
    3. MessageBox.Show("Button1")
    4. ElseIf sender.Equals(Button2) Then
    5. MessageBox.Show("Button2")
    6. ElseIf sender.Equals(Button3) Then
    7. MessageBox.Show("Button3")
    8. ElseIf sender.Equals(Button4) Then
    9. MessageBox.Show("Button4")
    10. ' ...
    11. End If
    12. 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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Das ist perfekt! Doch muss ich diesen Code nun in allen Buttons eintragen oder ist es ok wenn ich das in einem Button nur packe? WEil beim Handle sind ja alle anderen Buttons schon gelistet

    //Edit:
    @RodFromGermany
    Wow es funktioniert! Danke dafür :)
    Doch was wäre wenn man die Buttons Dynamisch erzeugen würde?

    ClonkAndre schrieb:

    Das ist perfekt!
    Hmm - was ist daran nu entscheidend besser als an einem Select Case?

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click
    2. Select Case True
    3. Case sender Is Button1
    4. MessageBox.Show("Button1")
    5. Case sender Is Button2
    6. MessageBox.Show("Button2")
    7. Case sender Is Button3
    8. MessageBox.Show("Button3")
    9. Case sender Is Button4
    10. MessageBox.Show("Button4")
    11. ' ...
    12. End Select
    13. End Sub

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click
    2. MessageBox.Show(DirectCast(sender, Control).Name)
    3. End Sub
    Aber ich bezweifel, ob dir das wirklich soo viel bringen wird.

    Nach wie vor ist mir unklar, was eiglich das Problem ist, falls es eines gibt.
    Alles klar.
    Ich benutze erstmal deinen Code weil das ist einzeiler und ja.. Wenn es ein Problem mit deinem Code geben sollte dann kann ich ja die Select Case Methode verwenden.

    Danke nochmal an dich und RodFromGermany :)

    ClonkAndre schrieb:


    Doch was wäre wenn man die Buttons Dynamisch erzeugen würde?


    Das geht mit AddHandler.

    VB.NET-Quellcode

    1. Private Sub CreateButtons()
    2. Dim btn1 As New Button() With {.Name = "bnt1"}
    3. Dim btn2 As New Button() With {.Name = "bnt2"}
    4. Dim btn3 As New Button() With {.Name = "bnt3"}
    5. AddHandler btn1.Click, AddressOf MyButton_Click
    6. AddHandler btn2.Click, AddressOf MyButton_Click
    7. AddHandler btn3.Click, AddressOf MyButton_Click
    8. End Sub
    9. Private Sub MyButton_Click(sender As Object, e As RoutedEventArgs)
    10. Dim currBtn As Button = TryCast(sender, Button)
    11. If currBtn IsNot Nothing Then
    12. MessageBox.Show(DirectCast(sender, Button).Name)
    13. Else
    14. MessageBox.Show("Error: Es wurde kein Button geklickt!!")
    15. End If
    16. End Sub


    Hier sollte man aber beim Form_Close mit RemoveHandler allerdings dann auch wieder aufräumen damit der GC das Object korrekt verwerfen kann.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    @ Nofear23m
    Ich glaube nicht, daß da jemals Nothing raus kommt, die Abfrage kann man sich sparen. :D

    Ich Iniziiere Controls, wenn es geht, im Designer, dafür ist er ja da, die EventHandler, aber im code, das ist flexibler.

    VB.NET-Quellcode

    1. Private Sub AddButtonsHandler()
    2. For Each con In Controls
    3. If con.GetType() Is GetType(Button) Then
    4. AddHandler DirectCast(con, Button).Click, AddressOf Button_Click
    5. End If
    6. Next
    7. End Sub
    8. Private Sub Button_Click(sender As Object, e As EventArgs)
    9. MessageBox.Show(DirectCast(sender, Button).Name)
    10. End Sub
    @FormFollowsFunktion

    Nicht solange der Code ungeändert bleibt.
    Sicher ist sicher. Wenn er mal statt Name ein anderes Propertie abruft macht es einen unterschied obs ei Button oder eine Checkbox ist.
    Denn ich nehme an das es nicht beim Namen bleibt. Das ist ja nur fürs Forum. Hat ja wenig Sinn.
    Tut niemanden weh abzufragen, und wenns wirklich mal schiefgeht wird man darauf hingewiesen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    Nofear23m schrieb:

    Tut niemanden weh abzufragen
    Doch - mir tut das weh, abzufragen, was niemals eintreten kann.
    Vor solchem Code hockt man in 2 Jahren stundenlang, und fragt sich, was der Autor damit wohl bezweckte. Die Antwort: "sinnlos" muss immer das allerletzte sein, was man in Betracht zieht, und nur, wenn einem wirklich nichts mehr einfällt.

    zum Beispiel muss man hier konkret zuvor eine gründliche Untersuchung starten, was denn sonst geklickst worden sein könnte, wenn der Autor eine Messagebox für nötig hielt: "Es wurde kein Button geklickt!!"
    Erst wenn da zuverlässig nichts gefunden wird kann man die Antwort wagen: "sinnlos".

    Wie gesagt: Sowas hält enorm auf - oft mehr als falscher Code, den man immerhin verstehen kann.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Wenn ich vor dem Code 2 Stunden sitze hab ich andere Probleme.
    Ich frage lieber 1 mal mehr ab um sicher zu gehen als 1 mal zu wenig und ich bekomme eine Exception um die Oren geworfen.
    Ist vieleicht eine persönliche Sache, aber sicher ist sicher. Der Code kann über mehre Klassen verteilt sein und irgendwann ist dann doch kein Button mehr.
    Und dann? Exception. Klar, die fängt man dann in Dispatcher_UnhandledException auf. Toll
    Und dann wird mal gesucht. Wozu denn?

    Ich habs mir angewöhnt und stelle sicher das ich Casten kann bevor ich Caste.
    Kommt mir jetzt nicht mit Performance. Bitte

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    Nofear23m schrieb:

    Ich frage lieber 1 mal mehr ab um sicher zu gehen als 1 mal zu wenig und ich bekomme eine Exception um die Oren geworfen.
    Ich hingegen frage bewusst nicht ab, was bei korrekter Programmierung nicht auftreten darf.
    Kommt dann eine Exception, weiß ich, dass ich einen Fehler gemacht hab, wo der verortet ist, und kann ihn beheben.

    Du bekommst da nur eine ziemlich beschönigende Messagebox, und dein Proggi rennt schön weiter - in den nächsten FolgeFehler.

    Ist ein verbreitetes Missverständnis, Exceptions für ein Problem zu halten. Exceptions sind nicht das Problem, sie melden es nur - sind also eine unschätzbare Hilfe.
    Und das soll man nicht durch Messageboxen ersetzen, wie "Es wurde kein Button geklickt!!".
    Da gebe ich dir auch Recht. Die Mesaagebox sag nicht viel aus. Ich mach das meist ja auch so das ich dann mit Throw MyOwnException was eigenes werfe was mir alle Infos gibt und Loggt, aber das wäre hier für ein Beispiel zu viel.

    Ich geb dir ja auch Recht. Hier im Forum muss man ja aufpassen da viele dann nicht damit umgehen können. Ich muss dir aber sagen das ich hier prüfen würde. Mit einer etwas anderen Routine aber ich würde prüfen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Ich frage Nothing (oder auch 0) nur ab, wenn ich Nothing explizit erwarte, also z.B. bei Abfragen von Systemdaten, oder eben wenn eine eigene Funktion auch Nothing ausgeben kann.
    Der Rest der Programmlogig muss stimmen und Benutzereingaben dürfen sowieso kein Nothing ergeben.