hScrollBar - ungültige Werte möglich?



  • Hallo,

    ich habe eine WindowsForms Anwendung in der verschiedene Berechnungen durchgeführt werden. Über eine hscrollbar kann man einen Parameter zwischen 0-100 einstellen, welcher dann Auswirkungen auf die Berechnungen hat. Dieser Parameter wird gleichzeitig auch in einem NumericUpDown-Element angezeigt, wo er ebenfalls verändert werden kann. Sprich diese beiden Elemente sind voneinander abhängig und ändern sich immer parallel. Diese Änderungen werden über das "Value_changed"-Event aktualisiert.

    Meine Frage ist jetzt, ob man bestimmte Bereiche dieser Scrollbar und des NumericUpDown quasi für ungültig erklären kann, dass sie übersprungen werden? Ich möchte z.B. keinen Wert zwischen 0-10 haben, wenn ein solcher Wert im NumericUpDown eingegeben wird soll auf 0 gesprungen werden. Wenn man aber bei der Scrollbar bei dem Wert 0 ist und auf den Pfeil nach rechts drückt, soll auf 10 gesprungen werden. Bei 10 und Klick auf den Pfeil nach links, Sprung auf den Wert 0.

    Habe mich schon darin versucht selbst eine Methode zu schreiben, jedoch ist nichts brauchbares dabei rumgekommen. Hat jemand eine Idee, wie das funktionieren könnte?

    Gruß
    thund3r



  • Ich wüsste nicht wieso das nicht gehen sollte.
    Zeig doch mal was du probiert hast.



  • Also mein letzter Stand ist dieser:

    private void hScrollBar2_ValueChanged(object sender, EventArgs e)
    {
       int oldV = 0;
       int newV = hScrollBar2.Value;
       if(hScrollBar2.Value < 10 && hScrollBar2.Value != 1)
          {newV = 0;}
    
       if(hScrollBar2.Value == 1 && oldv != 0)
          {newV = 0;}
    
       oldV = hScrollBar2.Value;
       hScrollBar2.Value = newV;
    
       numericUpDown2.Value = Convert.ToDecimal(hScrollBar2.Value);
    }
    

    Das ist der Teil, der beim Verändern des Scrollbarvalues aufgerufen wird. Ich verwende den oldV um zu überprüfen, ob der Value nicht bei '0' war, da ich ansonsten gar nicht vom Wert '0' weg kommen würde.

    // Globale Variable
    double old_Value = 0.00;
    
    private void numericUpDown2_ValueChanged(object sender, EventArgs e)
    {
       hScrollbar2.Value = Convert.ToInt16(numericUpDown2.Value);
       hScrollBar2_ValueChanged(sender, e);
    
       double v1 = Convert.ToDouble(numericUpDown2.Value);
    
       if(v1 < 10 && v1 > 0)
       {
        if(v1 <= old_Value)
        {
          hScrollBar2.Value = 0;
        }
        else
        {
          hScrollBar2.Value = 10;
        }
       }
    
       old_Value = Conver.ToDouble(numericUpDown2.Value);
    }
    

    Auch hier vergleiche ich wieder mit dem vorherigen Wert um zu überprüfen ob auf '0' oder '10' gesprungen werden muss. Außerdem rufe ich in dieser Methode die obere Methode auf, damit sich die Werte gegenseitig aktualisieren. (Vielleicht gar nicht unbedingt nötig)
    Mit diesem Stand funktioniert es eben über die Pfeiltasten jeweils perfekt, nur wenn ich im NumericUpDown-Feld mehrfach hintereinander den Wert '1' eingebe, springt er zwischen '0' und '10' hin und her.. 😞

    Mir fällt gerade noch auf, dass man die Variable 'oldV' auch außerhalb der Methode setzen müsste, weil sie ja so bei jedem Aufruf auf '0' gesetzt wird...



  • Springt er wirklich immer hin und her?
    Oder ist er beim 1 mal 10 und danach immer 0?

    Also, auf jedenfall mal wie du schon gesagt hast oldValue global machen, ausserdem im NumericaValueChanged, falls der Wert zwischen 0 und 10 ist, haben das Feld und die Scrollbar unterschiedliche Werte.
    Ich denke das ist so nicht gewollt.



  • So, also eigentlich sollte das ja so funktionieren (hoffe bin da nicht voll auf dem falschen Dampfer^^):

    int oldValue = -1;
    
    private void hScrollBar2_ValueChanged(object sender, EventArgs e)
    {
       if(oldValue == 10)
       {
          //Keine Ahnung woher du das nimmst, aber hier sollte halt das mit dem 
          //linker button klick geprüft werden.
          if(leftButtonClicked)
          {
             scroll.Value = 0;
          }
       }
       else if(oldValue == 0)
       {
          scroll.Value = 10;
       }
       numeric.Value = scroll.Value;
       oldValue = scroll.Value;
    }
    
    private void numericUpDown2_ValueChanged(object sender, EventArgs e)
    {
       if(numeric.Value < 10 && numeric.Value > 0)
       {
          numeric.Value = 0;
       }
    
       oldValue = numeric.Value;
       scroll.Value = numeric.Value;
    }
    

    Die prüfung auf die 1 habe ich jetzt mal nicht drinnen, da ich nicht wusste wieso du genau auf eine 1 prüfst.



  • Hi,

    okay danke schon mal soweit.

    Ich hatte schon mal versucht an die Button-Klicks dran zu kommen, hat aber nicht geklappt. Da werde ich jetzt nochmal ansetzen.

    Die prüfung auf die 1 habe ich jetzt mal nicht drinnen, da ich nicht wusste wieso du genau auf eine 1 prüfst.

    Auf die 1 hatte ich geprüft um eben zu überprüfen, ob der Wert erhöht wurde, und dadruch auf 10 springen müsste.

    Ich werde das jetzt mal ausprobieren und berichte dann, ob es geklappt hat.

    Danke dir!


Anmelden zum Antworten