NumericUpDown: Schrittweite mit Mausrad anders als mit Up/Down

  • VB.NET

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

    NumericUpDown: Schrittweite mit Mausrad anders als mit Up/Down

    Für die Zahleneingabe setzte ich gerne NumericUpDown Controls ein. Die Schrittweite für das Srpcken auf die kleinen Pfeile nach oben oder unten lässt sich einfach einstellen. Wenn ich dann aber die Einstellung mit dem Mausrad verändere ergibt sich immer die dreifache Schrittweite. Kann das geändert werden ohne das eine allgemeine Systemeinstellung in Windows dauerhaft geändert wird?
    Das Incement soll 1 sein (Mausrad und UpDown Pfeile). Gibt es vielleicht die Möglichkeit die kleinen UpDown-Pfeile auszublenden?

    Herausgefunden habe ich, dass die Schrittweite beim Mausrad mit SystemInformation.MouseWheelScrollLines abgefragt werden kann. Auch wurde hier an einer Lösung in #C gearbeitet: mycsharp.de/wbb2/thread.php?postid=292601

    Hier steht auch noch etwas in #C: connect.microsoft.com/VisualSt…lt-in-different-increment
    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// A NumericUpDown class that handles mouse wheel scrolling correctly
    3. /// </summary>
    4. public class MyNumericUpDown : NumericUpDown
    5. {
    6. protected override void OnMouseWheel(MouseEventArgs e)
    7. {
    8. // Change the value based on the number of wheel clicks.
    9. // NOTE: This overrides a bug in NumericUpDown where the value
    10. // change is based on the mouse wheel scrolling setting in Control
    11. // Panel.
    12. //
    13. decimal val = Value;
    14. val += ((e.Delta/120) * Increment);
    15. if (val < Minimum)
    16. {
    17. val = Minimum;
    18. }
    19. else if (val > Maximum)
    20. {
    21. val = Maximum;
    22. }
    23. Value = val;
    24. }
    25. }



    Kennt ihr eine Lösung un VB?

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

    Nimm doch nen C# to VB.Net Übersetzungstool. Gibts auch Online.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Mit einem C# to VB.Net Übersetzungstool komme ich leider auch nicht weiter, da ich dann bei der weiteren Umsetzung scheitere.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class MyNumericUpDown
    2. Inherits NumericUpDown
    3. Protected Overrides Sub OnMouseWheel(ByVal e As MouseEventArgs)
    4. Dim val As Decimal = Value
    5. val +=((e.Delta / 120) * Increment)
    6. If val < Minimum Then
    7. val = Minimum
    8. ElseIf val > Maximum Then
    9. val = Maximum
    10. End If
    11. Value = val
    12. End Sub
    13. End Class

    Was muss man machen damit es mit zwei NumericUpDown funktioniert?

    Das "Extended NumericUpDown Control" aus dem vorherigen Beitrag zeigt das gleiche Verhalten mit der vergrößerten Schrittweite. Mich wundert, dass dieses Problem hier im Forum nicht schon irgendwo gelöst worden ist (oder ich habe die Lösung nicht gefunden...).

    Hier ein Lösungsansatz von mir, der nur an den Rändern nicht richtig funktioniert. Der erste Schritt an den Rändern ist immer ein 3er-Schritt. Sonst funktioniert es:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NumericUpDown1.MouseWheel
    2. Dim value As Decimal
    3. If e.Delta < -1 Then
    4. value = NumericUpDown1.Value + SystemInformation.MouseWheelScrollLines - 1
    5. Else
    6. value = NumericUpDown1.Value - SystemInformation.MouseWheelScrollLines + 1
    7. End If
    8. If value > NumericUpDown1.Maximum Then value = NumericUpDown1.Maximum
    9. If value < NumericUpDown1.Minimum Then value = NumericUpDown1.Minimum
    10. NumericUpDown1.Value = value
    11. End Sub
    Hi,

    Du möchtest also, dass wenn das Rad gedreht wird, der Wert nur um 1 erhöht, bzw. vermindert wird. Verstehe ich das richtig?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hab Dir ein Projekt hier angehängt. Im Grunde recht einfach zu lösen.

    Erstelle Dir eine Ableitung der NumericUpDown-Klasse, überschreibe dann die OnMouseWheel Prozedur wie folgt.

    VB.NET-Quellcode

    1. Public Class NumericUpDownX : Inherits NumericUpDown
    2. Protected Overrides Sub OnMouseWheel(e As MouseEventArgs)
    3. If e.Delta > 0 Then
    4. If MyBase.Value + 1 <= MyBase.Maximum Then
    5. MyBase.Value += 1
    6. End If
    7. Else
    8. If MyBase.Value - 1 >= MyBase.Minimum Then
    9. MyBase.Value -= 1
    10. End If
    11. End If
    12. End Sub
    13. End Class


    Das neue Control erscheint nach der 1. Erstellung des Projekts in der ToolBox, wo Du auch alle anderen Controls findest (ganz oben). Wenn Du weitere Fragen hast, einfach stellen.

    Im angehängten Projekt ist das obere NumericUpDown das modifizierte, das untere das standardmäßige.
    Dateien
    • WindowsApp28.zip

      (216,16 kB, 132 mal heruntergeladen, zuletzt: )
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Jetzt nur noch das Plus/Minus 1 durch MyBase.Increment ersetzen und fertig ist der Lack.
    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.
    Vielen Dank für eure Hilfe. Das ist doch ein esuper Verbesserung.
    Die aktualisierte Datei habe ich wieder angehängt.

    In das Projekt kopieren und mit ins Projekt mit aufnehmen. Wie beschrieben taucht es dann nach dem ersten Kompilieren in der Toolbox auf.
    Dateien
    • NumericUpDownX.vb

      (485 Byte, 99 mal heruntergeladen, zuletzt: )

    VB.NET-Quellcode

    1. Public Class NumericUpDownX : Inherits NumericUpDown
    2. Protected Overrides Sub OnMouseWheel(e As MouseEventArgs)
    3. If e.Delta > 0 Then
    4. If MyBase.Value + MyBase.Increment <= MyBase.Maximum Then
    5. MyBase.Value += MyBase.Increment
    6. Else
    7. MyBase.Value = MyBase.Maximum
    8. End If
    9. Else
    10. If MyBase.Value - MyBase.Increment >= MyBase.Minimum Then
    11. MyBase.Value -= MyBase.Increment
    12. Else
    13. MyBase.Value = MyBase.Minimum
    14. End If
    15. End If
    16. End Sub
    17. End Class


    Füge noch jeweils einen Else-Zweig ein, damit auch immer das Maximum, bzw. Minimum erreicht wird.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o