Mehrfache Ereignisse

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von DL3AD.

    Mehrfache Ereignisse

    Hallo,

    folgendes Senario:

    Einige Radiobutton senden per Event verschiedene Werte an ein Label und aktualisiert auch das Value eines NumericUpDown.
    Nun möchte ich zur Feineinstellung mit dem NumericUpDown auch Werte an das Label senden.
    Verwende ich nun beim NumericUpDown das Value Change Event - dann kommt es zu mehrfach Events - und dass möchte ich vermeiden.
    Auch dass Kaskadieren von Events möchte ich vermeiden (Radiobutton => NumericUpDown => Label)
    Nun gibt es ja bei dem NumericUpDown mehrere Bedienmöglichkeiten wie Mousewheel, Klicken und Kursortasten.
    Wie bekomme ich dass hin ? - kann man beim NumericUpDown mehrere Ereignisse angeben ?
    Habe es versucht mit Komma getrennt weitere Events anzufügen aber da mecker er wegen der Signatur.

    Hier mein TestCode

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub RadioButton_Wert1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton_Wert1.CheckedChanged
    3. Label_Anzeige.Text = "25"
    4. NumericUpDown1.Value = 25
    5. End Sub
    6. Private Sub RadioButton_Wert2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton_Wert2.CheckedChanged
    7. Label_Anzeige.Text = "50"
    8. NumericUpDown1.Value = 50
    9. End Sub
    10. 'Hier mehrfach Events Label wird zweimal aktualisiert
    11. 'Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    12. ' Label_Anzeige.Text = NumericUpDown1.Value.ToString
    13. 'End Sub
    14. 'Hier mäckert er wegen der Signatur
    15. Private Sub NumericUpDown1_Events(sender As Object, e As KeyEventArgs) Handles NumericUpDown1.KeyDown, NumericUpDown1.MouseClick
    16. Label_Anzeige.Text = NumericUpDown1.Value.ToString
    17. End Sub
    18. End Class
    @DL3AD
    Ich versteh auch nicht ganz, wieso du das ValueChanged-Event nicht verwenden kannst/willst. Auf jeden Fall müsste dein Code so funktionieren:

    VB.NET-Quellcode

    1. Private Sub NumericUpDown1_Events(sender As Object, e As EventArgs) Handles NumericUpDown1.KeyDown, NumericUpDown1.MouseClick
    2. MessageBox.Show("Test")
    3. End Sub

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Ich denke mal das Problem ist herauszufinden, ob es sich um eine Eingabe des Users handelt oder um eine Änderung aus dem Programmcode heraus. Bei deinem Code ist das Problem, dass KeyEventArgs nicht von MouseClick verwendet wird. Benutze einfach EventArgs anstatt KeyEventArgs, da das die Basisklassen von beiden ist. Wenn du noch nach einer weiteren Lösung für das Problem suchst, kannst du dir auch mal diese Frage anschauen.
    ... das ValueCange Event wird gefeuert wenn sich das Value ändert.
    Ich ändere einmal das Value durch einen Radiobutton und auch durch Usereingaben.

    Fall 1 Anderung durch Radiobutton - Radiobutton aktualisiert das Label - dass ist ok und Radiobutton ändert NumericUpDown - auch ok
    NUN weil der Radiobutton das Value geändert hat wird gleich noch einmal das Label aktualisiert. - das ist nicht ok dass will ich nicht.

    Fall 2 Anderung des Value (durch den User) des NumericUpDown - Event Label aktualisiert - das ist ok.

    In der richtigen Anwendung wird kein Label sondern eine Hardware gesteuert !

    Ich hoffe die Problematik ist klar geworden

    EDIT: Lösung gefunden

    ... verwende das ValueChange Event und schalte es einfach ab und wieder ein mit remove und add Evendhandler
    Stand in einem Tut von @ErfinderDesRades

    Danke für eure Hilfe.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DL3AD“ ()

    DL3AD schrieb:

    lies bitte aufmerksam nocheinmal Beitrag #1

    Ich schätze, das wird nicht notwendig sein. Die Problematik ist mir durchaus klar. Aufgrund dessen habe ich meine Antwort geschrieben. Vielleicht liest du diese nochmal.
    Da war nämlich auch eine Frage drin.

    DL3AD schrieb:

    Fall 1 Anderung durch Radiobutton - Radiobutton aktualisiert das Label - dass ist ok und Radiobutton ändert NumericUpDown - auch ok
    NUN weil der Radiobutton das Value geändert hat wird gleich noch einmal das Label aktualisiert. - das ist nicht ok dass will ich nicht.

    Info: Radiobutton aktualisiert das Label - dass ist ok

    Dann entferne die Änderungen des Labels in den Zeilen 4 und 9. Wenn der Wert in Zeile 5 und 10 geändert wird, übernimmt die Valuechanged-Sub die Änderungen wo auch immer.
    Würde für dein Beispiel folgendes bedeuten:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub RadioButton_Wert1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton_Wert1.CheckedChanged
    3. NumericUpDown1.Value = 25
    4. End Sub
    5. Private Sub RadioButton_Wert2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton_Wert2.CheckedChanged
    6. NumericUpDown1.Value = 50
    7. End Sub
    8. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    9. Label_Anzeige.Text = NumericUpDown1.Value.ToString
    10. End Sub
    11. End Class
    Hey,

    ich hab, ehrlich gesagt, nicht verstanden, was Du überhaupt erreichen willst. Möchte ich verschiedene Controls über eine Änderung informieren, so würde ich dies über DataBinding lösen. Hab hier ein Beispiel für Dich. Falls es Deinen Anforderungen entspricht, dann sag Bescheid.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _controller As New ValueController()
    3. Public Sub New()
    4. InitializeComponent()
    5. BindingSource1.Add(_controller)
    6. End Sub
    7. Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged
    8. Select Case True
    9. Case sender Is RadioButton1
    10. _controller.TheValue = 50
    11. Case sender Is RadioButton2
    12. _controller.TheValue = 25
    13. End Select
    14. End Sub
    15. End Class
    16. Public Class ValueController : Implements System.ComponentModel.INotifyPropertyChanged
    17. Private _theValue As Decimal
    18. Public Property TheValue As Decimal
    19. Get
    20. Return _theValue
    21. End Get
    22. Set(value As Decimal)
    23. If Not _theValue = value Then
    24. _theValue = value
    25. OnPropertyChanged("TheValue")
    26. End If
    27. End Set
    28. End Property
    29. Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    30. Protected Overridable Sub OnPropertyChanged(propName As String)
    31. Dim e As New System.ComponentModel.PropertyChangedEventArgs(propName)
    32. RaiseEvent PropertyChanged(Me, e)
    33. End Sub
    34. End Class


    Füge Deinem Projekt eine Klasse (hier genannt: ValueController) hinzu, gib dieser Klasse eine Property, die den Wert hält. Von nun an sprichst Du nur noch diese Property an. Verbinde die Controls über eine BindingSource mit dieser Property und stelle den UpdateModus auf "OnPropertyChanged". Ändert sich diese Property, egal woher, so werden die gebundenen Controls über diese Änderung informiert. Dies geschieht über das PropertyChanged-Event. Im Gegenzug: Ändert sich z. B. der Wert des NumericUpDowns, so wird die Datenquelle ebenfalls informiert. Diese Binding arbeitet Bi-Direktional.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    ... im aktuellen Projekt habe ich es soo gelößt

    VB.NET-Quellcode

    1. 'Anzeige L-Wert aktualisieren
    2. RemoveHandler NumericUpDown_Lwert.ValueChanged, AddressOf NumericUpDown_Lwert_ValueChanged
    3. NumericUpDown_Lwert.Value = Convert.ToDecimal(DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).L_Wert)
    4. AddHandler NumericUpDown_Lwert.ValueChanged, AddressOf NumericUpDown_Lwert_ValueChanged
    5. 'Anzeige C-Wert aktualisieren
    6. RemoveHandler NumericUpDown_Cwert.ValueChanged, AddressOf NumericUpDown_Cwert_ValueChanged
    7. NumericUpDown_Cwert.Value = Convert.ToDecimal(DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).C_Wert)
    8. AddHandler NumericUpDown_Cwert.ValueChanged, AddressOf NumericUpDown_Cwert_ValueChanged


    funktioniert einwandfrei und sind nur 4 zusätzliche Codezeilen.

    Danke für deinen Vorschlag.