Probleme mit NumUpDowns. Durch eine maximale Grenze an möglichen klicks

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Black-Mage.

    Probleme mit NumUpDowns. Durch eine maximale Grenze an möglichen klicks

    Ich habe ein kleines Problem mit NumUpDown´s kurz (NUD's) und hoffe ihr könnt mir helfen.

    Zu klären ist das ich den Begriff Pool verwende dieser ist im Grunde ein Punkte-Guthaben und bezieht sich nur auf eine Variable die in den Settings hinterlegt ist My.Settings.AttrRest und zwar mit dem Wert 14
    Pool ist eben kürzer als My.Settings.AttrRest *g*

    Folgendes ist nun der Fall. Ich habe auf einer Form 7 NUD´s die mit 0 Beginnen und einen Maxwert von 4 haben. Dies ist jeweils in den Eigenschaften eingestellt.
    Dann habe ich eben besagten "Pool" den man mit den NUD's verteilen kann oder eben wieder in den Pool zurück geben kann wenn man den Pfeil runter klickt.

    Ich hatte zuerst das Problem, das ich nicht abfragen kann, ob nun Pfeil auf oder Pfeil ab gedrückt wurde. Dieses habe ich nach ein wenig suchen im Internet aber mit hilfe einer Variable "Oldvalue" und den Vergleich mit der NUD.Value kurz dann Value
    hinbekommen. So kann ich abfragen was geklickt wurde.

    Da ich nun aber noch ein "Pool" habe mit 14 Punkten also die NUD's nicht alle einfach bis auf 4 gehoben werden können sondern eben verteilt werden müssen, muss ich auch irgendwie eine Grenze einbringen. Ab wann man eben nicht mehr weiter auf Pfeil auf klicken kann..

    Nun stosse ich auf ein neues Problem. Ist der Pool nun auf 0 also leer, sollte nichts passieren wenn ich auf Pfeil auf klicke. Leider... steigt die Value in der NUD trotzdem um eines an , es wird dann zwar nichts im Pool geändert aber der Wert stimmt nun nicht mehr, drücke ich nun auf Pfeil runter steigt der Pool eben um einen Punkt an und "generiert" einen Punkt den es im Grunde nicht gibt.

    Gelöst habe ich das in Punkt 10 des Codes weiter unten. Es wird nun an Stelle der alte Wert der NUD.Value wieder eingetragen. So bleibt nach weiteren klicken auf Pfeil auf und bei "leerem Pool" dieser "für den Nutzer" sichtbar auf den alten Wert.

    Nun habe ich aber das Problem und keine Idee was ich machen kann, wenn der Code zur Stelle 10 kommt. (also 1. der Nutzer klickt auf Pfeil auf und 2. der Pool ist aktuell auf 0 also leer) dann rutscht der Code nach der Änderung der NUD.Value auf den alten Wert in das untere Else, also eigtl. der Punkt der dafür verantwortlich ist, wenn man Pfeil runter geklickt hat, und der Pool steigt eben um 1 und es ist durcheinander.


    VB.NET-Quellcode

    1. Private Sub Num_main_Bew_ValueChanged(sender As Object, e As EventArgs) Handles Num_main_Bew.ValueChanged
    2. Static oldvalue As Integer
    3. Dim value As Integer = CInt(CType(sender, NumericUpDown).Value)
    4. If value > oldvalue Then
    5. If My.Settings.AttrRest > 0 Then
    6. My.Settings.AttrRest = My.Settings.AttrRest - 1
    7. oldvalue = value
    8. Else
    9. CType(sender, NumericUpDown).Value = oldvalue
    10. End If
    11. Else
    12. My.Settings.AttrRest = My.Settings.AttrRest + 1
    13. oldvalue = value
    14. End If
    15. Label_main_RestAttrPunkte.Text = My.Settings.AttrRest.ToString
    16. End Sub



    hat jemand evtl. eine Idee wie ich entweder das Control zwingen kann sollte der Pool leer sein, nicht mehr auf den Pfeil auf zu reagieren, oder was ich am Code ändern könnte, damit nicht in das untere Else gesprungen wird. Sobalt ich die Value wieder angleiche.
    ??? Nix verstanden.

    Black-Mage schrieb:

    das Control zwingen kann
    Mach Dir ein eigenes von NUD abgeleitetes Control, das Du genau das tun lässt, was es tun soll.
    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!
    Willst du irgendwie einfach prüfen ob die SUMME der NUD.Values = Pool ist?!
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    MemoAnMichSelbst schrieb:

    Willst du irgendwie einfach prüfen ob die SUMME der NUD.Values = Pool ist?!


    Nein, ich verwende das natürlich weiter. Die Werte eben 0 bzw. 1-4 die in den NUD's zur Möglichkeit stehen werden auf ein anderen Feld addiert.
    Um es zu veranschaulichen, Ich habe ein Feld das eine Zahl beinhaltet dann eben das dazugehörige NUD und aus deren zwei Werte ergibt sich eine Summe die im SummenFeld steht. Das eben 7 mal.
    Wird aus dem Pool eben kein Punkt weg genommen und auf ein NUD verteilt bleibt es eben bei 0 und so wäre präktisch das Feldx und das SummenFeldx eben gleich. Sollte der Nutzer eben das NUD erhöhen wird das aus dem Pool abgezogen. Und würde auf das SummenFeld addiert.

    <Feld1> <NUD1> <SummenFeld1>
    <Feld2> <NUD2> <SummenFeld2>
    <Feld3> <NUD3> <SummenFeld3>
    <Feld4> <NUD4> <SummenFeld4>
    <Feld5> <NUD5> <SummenFeld5>
    <Feld6> <NUD6> <SummenFeld6>
    <Feld7> <NUD7> <SummenFeld7>

    Das wäre das grobe wie ich damit arbeite, und stosse auf das Problem von oben aus Post 1 das ich beschrieben habe.
    Also doch?!
    Du hast nen Pool von "18" (Beispiel)
    Jedes NUD kann man in 1er-Schritten erhöhen oder Reduzieren.
    Jeder NUD kann max. 4 sein.
    Wenn nun "18" erreicht sind, darf kein NUD mehr erhöht werden.
    Außer es wird vorher ein anderes wieder reduziert.
    !?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ich habe mal quasi 7 NUDs auf ne Form geschmissen (heißen noch wie Standard... Weil ich faul bin).
    Habe zudem nen Label (lblPool) auf die Form geworfen.
    Dann folgenden Code benutzt...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class NUDTest
    2. Private _pool As Decimal = 18D
    3. Private Sub NumericUpDown_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged, NumericUpDown2.ValueChanged, NumericUpDown3.ValueChanged,
    4. NumericUpDown4.ValueChanged, NumericUpDown5.ValueChanged, NumericUpDown6.ValueChanged, NumericUpDown7.ValueChanged
    5. Dim sum = NumericUpDown1.Value + NumericUpDown2.Value + NumericUpDown3.Value + NumericUpDown4.Value + NumericUpDown5.Value + NumericUpDown6.Value + NumericUpDown7.Value
    6. If sum > _pool Then
    7. MessageBox.Show("Nix is")
    8. DirectCast(sender, NumericUpDown).Value -= 1
    9. lblPool.Text = (_pool - sum + 1D).ToString
    10. Else
    11. lblPool.Text = (_pool - sum).ToString
    12. End If
    13. End Sub
    14. Private Sub NUDTest_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    15. lblPool.Text = _pool.ToString
    16. End Sub
    17. End Class


    #EDIT: Hatte noch nen Fehler betreffend Strict On Drin. Hab ich wohl in der Heimumgebung nicht umgestellt oO

    PS: Beachte!!!! Man kann auch bei nem NUD was Dezimalstellen von 0 eingestellt hat sehr wohl Dezimalzahlen eingeben. Die werden NUR IN DER ANZEIGE gerundet. Der Value ist noch der Dezimalvalue!!!
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    Also ich hab es bei mir lauffähig.
    Du musst natürlich den Namen der Numericupdowns ersetzen.
    Könntest mal zeigen was du für nen Quellcode hast?

    VB.NET-Quellcode

    1. Private Sub NumericUpDown_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged, NumericUpDown2.ValueChanged, NumericUpDown3.ValueChanged,
    2. NumericUpDown4.ValueChanged, NumericUpDown5.ValueChanged, NumericUpDown6.ValueChanged, NumericUpDown7.ValueChanged
    3. Dim sum = NumericUpDown1.Value + NumericUpDown2.Value + NumericUpDown3.Value + NumericUpDown4.Value + NumericUpDown5.Value + NumericUpDown6.Value + NumericUpDown7.Value
    4. If sum > _pool Then
    5. MessageBox.Show("Nix is")
    6. DirectCast(sender, NumericUpDown).Value -= 1
    7. lblPool.Text = (_pool - sum + 1D).ToString
    8. Else
    9. lblPool.Text = (_pool - sum).ToString
    10. End If
    11. End Sub​

    ist das, was das ganze berechnet. Irgendwo brauchst du noch die in der Form deklarierte Variable "_pool"...
    Private _pool As Decimal = 18D

    Bei mir ist ja der Name der Form NUDTest also das gepostete war der ganze Quellcode der Form NUDTest...
    Aber Quellcode inkl Fehleranzeige wäre gut um genaueres zu sagen ;)

    Hab mal meinen Test angehangen.
    Dateien
    • TestApp.zip

      (135,69 kB, 105 mal heruntergeladen, zuletzt: )
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Habs hinbekommen.. Ich hab verpeilt das Form1 noch zu ändern. *hust*
    Nun keine Fehler *g*..

    Okay, das hat funktioniert. Deine MSGbox taucht auf und er behält auch die Value in dem NUD. Ich hab da wohl bei meinem versuch das zurichten in ganz falsche Richtungen gedacht ,(

    Vielen lieben dank das du mir geholfen hast.
    War denn mein kompletter Code falsch oder nur die ein oder andre Zeile?
    Nun... einmal hast du ja den Code von nur EINER NUD gepostet. Also hättest du das ganze zich mal schreiben müssen. ;)
    Dann halte ich nix von diesem "CType" gedönse. Wenn man weiß was man da castet ist nen Directcast schöner.
    Was du mitm CInt natürlich gut abfängst ist dass in nem NUD nunmal Dezimalwerte stehen. Ich weiß aber ausm Kopf nicht ob CInt rundet oder abschneidet. Also weiß ich nicht ob was anderes bei raus kommt wenn du 0,7 eingibst ins NUD, als angezeigt wird. Weil angezeigt würde ja 1. Wenn er nicht rundet würd CInt brav 0 sein. Weiß ich aber aus dem Kopf wirklich nicht und müsste es testen.
    Dann versteh ich das "static oldvalue as integer" so garnicht. Was soll das da? Du definierst nen Static also wär der 0?! Und vergleichst diesen dann.

    VB.NET-Quellcode

    1. My.Settings.AttrRest = My.Settings.AttrRest - 1

    sowas schreibt man einfach

    VB.NET-Quellcode

    1. My.Settings.AttrRest -= 1

    ist doch kürzer ;)
    Allgemein ist das Arbeiten mit dem OldValue bei dir sinnlos, da es nen Static vom Wert 0 ist... Oo Dat versteh ich net so recht was du da tust.
    Ich find den Code allgemein etwas unverständlich. Weil ich wohl so kompliziert nicht zu denken mag XD Müsste es erstmal auf ne Form hauen und gucken was da wo passiert. Dafür gibts ja das Debugging
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Huhu man hab das wohl dann doch zu dürftig geschrieben im ersten Post. Das Oldvalue sollte eigtl. den aktuellen Wert der Nud beinhalten und dann eben mit dem neuen Vergleichen, so wollte ich heraus bekommen, ob Pfeil auf oder Pfeil runter grdrückt wurde. Um dann eben entsprechend den Code zu hinterlegen. Static sollte das eben die ganze Zeit verfügbar machen. Obgleich die Prozedur durch ist. Das funktioniert auch die abfrage ob hoch oder runter geklickt wurde. Nur eben das mit dem CType(sender, NumericUpDown).Value = oldvalue, da lief es dann aus dem Ruder. Meine Vermutung ist, das durch die Änderung der Value der NUD das Ereignis
    ValueChanged erneut gefeuert wurde.

    Was das 0,7 angeht. Sieht da hab ich nichtmal dran gedacht, das jemand nun nen Komme da eintragen würde. Ich ging nur von ganzen Zahlen aus, und hatte bei meinen Test auch nur die Pfeile geklickt, und nichts direkt eingetragen.
    In dem Fall, dass du dir da was merken willst...
    Deklarier dir ne Klassen-Globale-Private Variable und benutz die.
    So hab ich es ja bei dem Pool gemacht.
    Müsstest dir aber dann für jedes NUD-Control eine machen oder ne Liste. Also nicht all zu schön. Lieber direkt die Summe der Werte auswerten. Das macht es dann doch einfacher und übersichtlicher.

    Ich probiert gerade mitm Static rum. Nette Spielerei. Aber sollte unnötig sein.
    Ich glaube mich zu erinnern dass er nur ne Kopie des Wertes sichert. Müsste mich aber erst wieder einlesen wie das Static da genau funktioniert.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    Ah ich hab gerade probiert.
    Das Problem ist, wenn du 7 NUDs hast und NUR eine Variable die Static ist... und du diese durch die erste NUD erhöht hast und die zweite NUD auf gleiche Variable zugreift... ist die Bedingung value > oldvalue direkt false ;)
    Also du erhöhst NUD1 auf 4... dann ist oldvalue = 4
    Nun erhörst du NUD2 auf 1 und er vergleicht 1 > 4... Und TADAAAA...
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    ErfinderDesRades schrieb:

    ich hätte noch einen Vorschlag.
    Statt Msgbox wenn pool leer kann man bei jeder Verändertung die MaxValues der Nuds so einstellen, dass überhaupt nicht mehr übers Ziel hinausgeschossen werden <span style="text-decoration: underline"><i>kann</i></span>.

    Er hat ja im NUD schon ein Max-Value von 4 hinterlegt.
    Aber ich wüsste nicht wie man ein Max-Value über die Summe mehrerer NUD hinterlegen kann. Macht bei den meisten Fällen ja auch weniger Sinn, denke ich.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    also angenommen, durch Nud-Betätigung seien nur noch 3 im pool.
    Dann setzt man "leere" Nuds auf auf MaxMalue 3, Nuds mit Value.1 aber auf Maxvalue.4.

    Angenommen, ein Nud "gibt nun einen zurück".
    Dann setzt man alle Maxvalues wieder ein höher, aber nicht über 4.

    solch lässt sich doch proggen?

    Man könnte sogar noch Labels zu jedem Nud hinmachen, oder Tooltips odersowas, die den jeweiligen Maxwert angeben.

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

    Ich glaube es gibt pro NUD nen Max Value von 4 (der is ja anscheinned Fix) und für die Summe aller NUDs nen Max-Value von 14.

    Ich find das Errechnen des "Max" ist das unkomplizierteste.
    Deine Erläuterung verstehe ich ehrlich gesagt nicht recht.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D