Sender und Event auswerten

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Sender und Event auswerten

    Hi,

    ich habe eine Form mit drei Buttons - nennen wir sie Button1, Button2 und Button3

    Die Click_Prozeduren dieser drei Buttons sind sehr einheitlich ... allein der Text des Buttons wird benötigt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. AcceptClick(Button1.Text)
    3. End Sub
    4. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    5. AcceptClick(Button2.Text)
    6. End Sub
    7. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    8. AcceptClick(Button3.Text)
    9. End Sub


    Das Coding ist natürlich dröge. Besser wäre es wohl nur eine Routine zu schreiben, die alle drei Ereignisse abfängt:

    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
    2. AcceptClick(...)
    3. End Sub


    Die Frage ist, wo ich jetzt den Button-Text her bekomme. Im Feld sender steht irgendwas wie

    sender {Text="Insert"}

    Aber wie komme ich da dran? Klar, ich könnte mit der Methode .ToString den Quatsch in einen String umwandeln und dann mit .Split den Text nach dem Gleichheitszeichen ausklamüsern. Aber das ist ja wohl nicht der Stand der Technik im Zeitalter der grenzenlosen Objektorientierung.

    "sender" hat nur 4 Methoden. Und die scheinen mir alle nicht zu passen. Und mit dem Feld "e" (event) kann ich schon gar nix anfangen.

    Hat jemand schlaue Ideen wie man das richtig anstellt ... oder alternative Lösungsvorschläge ...

    LG
    Peter
    Caste den sender in einen Button und dann kannst Du bei dem regulär die Text-Property abrufen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Trade hat es zwar schon erkärt, aber hier ein Gedankenanstoß:

    VB.NET-Quellcode

    1. Dim btn As Button = DirectCast(sender, Button)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Wichtig ist, es gibt noch andere Methoden richtig zu casten, die Geschwindigkeit ist dann auch immer anders.
    Kannst dir mal das ansehen (besonders Beitrag 2)
    TryCast richtig verstehen?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Ok ... was würdest du also alternativ vorschlagen, um ein "virtuelles Keyboard" zu programmieren ? Ich habe 28 Buttons, die jeweils genau das Zeichen übertragen sollen, das auf dem Button steht.

    LG
    Peter
    Nagut mMn ist das bei einem virtuellen Keyboard nicht unbedingt ein schlechter Ansatz.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Alternativ würde ich vorschlagen, Du nimmst einen Button als Vorlage, erweiterst die Klasse jedoch um Eigenschaften und Events. Ein KeyboardButton könnte z. B. eine Property KeyValue o. ä. haben. Ein KeyboardButton könnte auch ein Event KeyboardKeyPressed haben. Hier würde dann der Wert direkt zum Aufrufer gesendet werden und das Casting würde entfallen.

    Ich könnte mir auch vorstellen, ein UserControl zu nehmen und dieses als das komplette Keyboard zu sehen, welches die KeyboardButtons als Elemente hat.

    Hier nur mein Denkanstoss. Bin gerade in der Arbeit und habe nicht wirklich Zeit, das sauber zu programmieren. Soll auch nur die Richtung zeigen.

    UserControl:

    VB.NET-Quellcode

    1. Public Class Keyboard
    2. Public Sub New()
    3. InitializeComponent()
    4. For Each x As KeyboardButton In Me.Controls.OfType(Of KeyboardButton)()
    5. AddHandler x.KeyBoardButtonClick, AddressOf KeyboardButton_Click
    6. Next
    7. End Sub
    8. Private Sub KeyboardButton_Click(sender As Object, e As KeyboardButtonClickEventArgs)
    9. MessageBox.Show(e.KeyValue)
    10. End Sub
    11. End Class


    KeyboardButton:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class KeyboardButton : Inherits Button
    3. Public Event KeyBoardButtonClick As EventHandler(Of KeyboardButtonClickEventArgs)
    4. Private _value As String
    5. <Browsable(True)>
    6. Public Property Value As String
    7. Get
    8. Return _value
    9. End Get
    10. Set(value As String)
    11. _value = value
    12. MyBase.Text = value
    13. End Set
    14. End Property
    15. Protected Overrides Sub OnClick(e As EventArgs)
    16. If TypeOf (MyBase.Parent) Is Keyboard Then
    17. RaiseEvent KeyBoardButtonClick(Me, New KeyboardButtonClickEventArgs(Me.Value))
    18. End If
    19. MyBase.OnClick(e)
    20. End Sub
    21. End Class
    22. Public Class KeyboardButtonClickEventArgs : Inherits EventArgs
    23. Public ReadOnly KeyValue As String
    24. Public Sub New(keyValue As String)
    25. Me.KeyValue = keyValue
    26. End Sub
    27. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @Peter329 Etwas einfacher ist es, die Tag-Property des Controls auszuwerten. Die kannst Du im Designer vergeben und sie als String empfangen.
    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!