NumericUpDown - Festellen ob hoch oder runter gezählt worden ist

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von xCM2x.

    NumericUpDown - Festellen ob hoch oder runter gezählt worden ist

    Hallo zusammen,

    der Titel beschreibt mein Problem schon ziemlich genau. Anhand eines ValueChanged-Ereignisses kann ich feststellen, dass sich der Wert verändert hat.
    Wie kann ich nun feststellen, ob der Wert erhöht worden ist oder ob er verringert worden ist.

    Es gibt zwar einige Andeutungen wie:

    NumericUpDown.UpButton() bzw. NumericUpDown.DownButton(), jedoch weiß ich damit nichts anzufangen zumal beide keine Boolschen Werte zurückgeben.

    Kann mir da jemand helfen?

    Lieben Dank!
    Patrick
    Natürlich. Das Problem ist schlichtweg das ValueChanged Ereignis.

    Beispiel (dummes Beipiel aber im Moment habe ich wenig Zeit):


    Quellcode

    1. Sub def()
    2. Dim a As Integer = 1
    3. End Sub
    4. Sub abc() Handles NumericUpDown.ValueChanged
    5. 'NumericUpDown.Value ist aktuell = 0
    6. If NumericUpDown.Value > a Then
    7. MsgBox("A ist größer geworden!")
    8. End If
    9. End Sub


    Da bei mir alle Controls dynamisch erzeugt werden muss ich schlichtweg einfach wissen wie es möglich ist. Im Moment löse ich es so, dass bei jedem Aufruf des ValueChanged-Ereignisses das Control geleert wird und die Textboxen erneut geschrieben werden (somit muss ich nicht mehr kontrollieren ob der Wert verkleinert oder vergrößert wude).

    Falls das noch zu unverständlich ist, melden! Code wird dann gepostet.

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

    Hallo JumpingCap,

    sieht deine Sub wirklich so aus ?
    Sub abc() Handles NumericUpDown.ValueChanged
    ...
    End Sub


    Pfui !

    Gruss

    mikeb69

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

    Glaube nicht, sicher hat er nur das weggelassen, mache ich auch immer, wenns nicht benötigt wird, weils unnötige Schreibarbeit ist und ich mir da simmer nie merken kann was in den Klammern steht ^^ nur sender und e As irgendwas *g*
    Hallo JumpingCap,

    eine andere Lösung - vermutlich die Sauberste - wäre es einfach ein eigenens Control zu schreiben, welches von NumericUpDown erbt.

    Da ich gerade auf meine Buben warte bis diese von der Schule kommen, hab ich dir das mal geschrieben.

    Um es mir einfacher zu machen hab ich einfach ein neues Event eingeführt.
    Hier mal ein Beispielcode wie du das Control einsetzen kannst.

    VB.NET-Quellcode

    1. Imports NumericUpDown
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim n As New myNumericUpDown
    5. AddHandler n.NewValueChanged, AddressOf mynumeric_newvc
    6. Me.Controls.Add(n)
    7. End Sub
    8. Private Sub mynumeric_newvc(ByVal sender As Object, ByVal e As ValueChangedEventArgs)
    9. Me.Text = "Alter Wert = " & e.OldValue.ToString & " - Neuer Wert = " & e.CurrentValue.ToString
    10. End Sub
    11. End Class

    Features:
    Framework 2
    neues Event:

    VB.NET-Quellcode

    1. NewValueChanged(ByVal sender As Object, ByVal e As ValueChangedEventArgs)


    Im Anhang findest du das Control.

    Gruss

    mikeb69
    Dateien
    Hallo mikeb69,

    danke für deine Mühe. Ich werde die Control mal testen und ggf. eine Rückmeldung posten.

    Um es mal schriftlich präzise auszurücken:
    In meiner Form wird derzeit bei Veränderungen der NumericUpDown-Werte jeweils (in meinem Fall) das Panel-Controll geleert und anschließend wird gemäß des ausgewählten Wertes eine oder mehrere Textboxen auf diesem Panel erzeugt. Was mich hierbei stört, habe ich ja schon geschrieben: Ich muss jedes mal den Panelcontrol-Inhalt leeren, bei 10 Textboxen geht es noch, bei 100 wird es unschön, da man das flackern sofort sieht. Im Grunde genommen ist es nur ein Schönheitsfehler.

    Der Code:

    Quellcode

    1. Public Sub numVerzeichnis_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles numVerzeichnis.ValueChanged
    2. 'Textboxen und Labels bei Wertänderung entfernen
    3. pnlTextboxes.Controls.Clear()
    4. Dim arrDirectories(pnlTextboxes.Controls.Count) As String
    5. 'Generiere TextBoxen und Labels
    6. genTextboxes(numVerzeichnis.Value)
    7. End Sub


    Die Methode genTextboxes erstellt dann anhand der überladenen Variable entsprechend die Anzahl der Textboxen. Ich würde gerne anstelle von:

    Quellcode

    1. 'Textboxen und Labels bei Wertänderung entfernen
    2. pnlTextboxes.Controls.Clear()


    etwas zum Vergleichen haben. In deinem Falle habe ich das Problem, dass die Werte Strings sind und keine Integerwerte.
    Hallo JumpingCap,

    jetzt irritierst du mich etwas.
    In deinem Falle habe ich das Problem, dass die Werte Strings sind und keine Integerwerte.

    Ein NumericUpDown gibt nunmal zahlen aus.

    Das war ja das was du ursprünglich wolltest.
    Eine Möglichkeit festzustellen, ob die vorher gewählte Zahl kleiner oder größer als die jetzige ist.

    Das hab ich dir eingebaut.

    Anmerkung:
    Wenn ein Programm 100 Textboxen in einem Panel braucht, scheint irgendwas nicht den richtigen Weg zu laufen.

    Gruss

    mikeb69
    Das mit den Strings bezog sich auf diese Stelle:

    Quellcode

    1. Private Sub mynumeric_newvc(ByVal sender As Object, ByVal e As ValueChangedEventArgs)
    2. Me.Text = "Alter Wert = " & e.OldValue.ToString & " - Neuer Wert = " & e.CurrentValue.ToString
    3. End Sub


    Ich habs noch nicht testen können, aber ih denke dass man hier das ToString weglassen kann.
    Wieso sollten auf einem Panel keine 100 Textboxen erscheinen (auch wenn das jetzt übertrieben dargestellt ist). Die ganze Applikation ist dynamisch und somit kann ich während der Laufzeit Controls hinzufügen oder auch nicht. Ich habe zugegebenermaßen noch nie mit Klassenbibliotheken gearbeitet, weswegen ich dich hier fragen will:

    Ich erstelle einen Verweis auf die .dll und greife mit dem Aufruf

    Quellcode

    1. NewValueChanged(ByVal sender As Object, ByVal e As ValueChangedEventArgs)


    auf die Bibliothek zu, richtig? Was erhalte ich als Rückgabewert?
    Hallo JumpingCap,

    Der Teil mit dem Text ist nur zum Vorführen gedacht.
    Damit du siehst was sich tut.

    Am besten erstellst du ein neues Projekt und kopierst den Code in die Form.

    Ansonsten verwendest du die Dll genau wie das dir bekannte NumericupDown.
    Nur das es ein neues Event gibt.
    In diesem kannst du über die Variable e deine Informationen auslesen.

    Gruss

    mikeb69
    Also beim testen zeigt sich, dass es funktioniert. Kannst du mir vielleicht den Quellcode von der Klassenbibliothek geben?
    So kann ich auch verstehen, wie ein eigener EventHandler erstellt wird. Wäre echt klasse von dir.
    Hallo JumpingCap,

    kein Problem.

    VB.NET-Quellcode

    1. Public Class myNumericUpDown
    2. Inherits Windows.Forms.NumericUpDown
    3. Public Event NewValueChanged(ByVal sender As Object, ByVal e As ValueChangedEventArgs)
    4. Private oldvalue As Integer = -1
    5. Private Sub myNumericUpDown_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ValueChanged
    6. RaiseEvent NewValueChanged(Me, New ValueChangedEventArgs(oldvalue, Me.Value))
    7. oldvalue = Me.Value
    8. End Sub
    9. End Class
    10. Public Class ValueChangedEventArgs
    11. Public OldValue As Integer
    12. Public CurrentValue As Integer
    13. Public Sub New(ByVal o As Integer, ByVal c As Integer)
    14. OldValue = o
    15. CurrentValue = c
    16. End Sub
    17. End Class

    Das ist alles.

    Gruss

    mikeb69
    also ich hab 2 NumericUpDown mit dem will ich eine picturebox verschieben eins für x-achse und andere y-achse

    hab des so gemacht wie mikeb69 oben geschrieben hat aber des geht iwie ned ganz es geht nur die XAchse

    VB.NET-Quellcode

    1. Private Sub XAchse1_NewValueChanged(ByVal sender As Object, ByVal e As NumericUpDown.ValueChangedEventArgs) Handles XAchse1.NewValueChanged
    2. PictureBox1.Location = New System.Drawing.Point(PictureBox1.Location.X + e.CurrentValue.ToString)
    3. End Sub
    4. Private Sub YAchse1_NewValueChanged(ByVal sender As Object, ByVal e As NumericUpDown.ValueChangedEventArgs) Handles YAchse1.NewValueChanged
    5. PictureBox1.Location = New System.Drawing.Point(PictureBox1.Location.Y + e.CurrentValue.ToString)
    6. End Sub


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

    Hallo eMptY,

    naja - wenn du dir die Parameter von Point ansehen würdest, könntest du leicht selbst drauf kommen.
    Du hast nur einen Dreher bei den Parametern (von Point) in deinem Code.

    Gruss

    mikeb69