| Autor |
Beitrag |
okrim
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: Mo 12.05.14 23:31
Hallo an alle,
habe mal wieder ein Problem und finde keine Lösung, habe zwei numericUpDown eins für Kalenderwochen und eins für das Jahr, möchte wenn ich die letzte Kalenderwoche eines Jahres erreicht habe wieder mit Woche 1 anfangen und das Jahr um eins erhöhen und wenn Woche eins erreicht ist soll die letzte Woche des Vorjahres kommen und das Jahr um eins weniger, was mit folgenden Code auch wunderbar klappt.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| if (numericUpDown_woche.Value > anzahl_Weeks) { numericUpDown_woche.Value = 1; numericUpDown_jahr.Value++; }
if (numericUpDown_woche.Value < 1) { numericUpDown_woche.Value = anzahl_Weeks_vorjahr; numericUpDown_jahr.Value--; } |
nur habe ich das Problem wenn das aktuelle Jahr (anzahl_Weeks) 52 Wochen hat und das Vorjahr (anzahl_Weeks_vorjahr) 53 Wochen hat, kommt natürlich immer die eins, was ja auch logisch ist, nur weiß ich nicht wie ich es lösen kann das es geht.
Vielleich gibt es ja ne Möglichkeit zu differenzieren ob man den Pfeil nach unten oder nach oben drückt?
Würde mich freuen wenn mir von euch eine einen Tipp geben könnte, stehe voll auf dem Schlauch.
Danke im voraus
Gruß Mirko
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 13.05.14 07:59
So ganz verstehe ich das Problem nicht. Aber zu Deiner Frage, ob man sehen kann, was gedrückt wurde:
Kannst Du Dir nicht einfach den vorherigen Wert des NumericUpDown in einem Feld merken und durch Vergleich feststellen, ob erhöht oder erniedrigt wurde?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Für diesen Beitrag haben gedankt: okrim
|
|
okrim 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: Di 13.05.14 18:32
Hallo Christian,
erst mal Danke für deine Antwort.
Das Problem ist folgendes:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if (numericUpDown_woche.Value > anzahl_Weeks) { numericUpDown_woche.Value = 1; numericUpDown_jahr.Value++; }
if (numericUpDown_woche.Value < 1) { numericUpDown_woche.Value = anzahl_Weeks_vorjahr; numericUpDown_jahr.Value--; } |
Das mit dem Vergleich ist ne super Idee, ich werde mal versuchen ob ich das hinbekomme.
Gruß Mirko
|
|
Th69
      

Beiträge: 4803
Erhaltene Danke: 1060
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 13.05.14 18:45
Hallo okrim,
du meinst, "beim nächsten Mal klicken" springt er dann wieder auf 1?
Du solltest beim Verändern des Jahres dann natürlich auch die beiden Variablen anzahl_Weeks und anzahl_Weeks_vorjahr entsprechend anpassen. 
Für diesen Beitrag haben gedankt: okrim
|
|
okrim 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: Di 13.05.14 18:54
Hallo Th69,
Das mit dem Jahr ist gar nicht das Problem, das würde ja auch funktionieren, eigentlich funktioniert alles außer ich habe im aktuellen Jahr 52 Wochen und im Vorjahr 53 Wochen da dann immer 1 kommt.
Habe jetzt versucht den Tipp von Christian zu realisieren, nur weiß ich nicht wie ich den Wert vor Betätigung des NumericUpDown und den Wert nach der Betätigung her bekomme so dass ich feststellen kann ob ich rauf oder runter zähle, denn dann könnte ich ja mit einer weiteren if abfrage auf die if abfrage zugreifen die ich brauche.
Gruß Mirko
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 13.05.14 19:18
| Zitat: | | Das mit dem Jahr ist gar nicht das Problem, das würde ja auch funktionieren, eigentlich funktioniert alles außer ich habe im aktuellen Jahr 52 Wochen und im Vorjahr 53 Wochen da dann immer 1 kommt. |
Die erste Woche in einem neuen Jahr ist immer die 1.te Woche egal wieviele Wochen das alte Jahr hat. Also sollte da auch immer eine 1 kommen. Irgendwie sehe ich das Problem nicht oder was erwartest du anderes?
Edit : Ich glaube zwar nicht das es hilft weil es nicht das Problem ist  Aber hier mal ein abgeleitetes NUmmericUpDownControl das einen ButtonClicked Event wirft das mitliefert welcher der beiden Buttons geklickt wurde.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| public enum MyNumericUpDownButton { None, Up, Down }
public class MyNumericUpDownButtonClickedEventArgs : EventArgs { public MyNumericUpDownButton Button { get; set; } public decimal OldValue { get; set; } public decimal NewValue { get; set; } }
public class MyNumericUpDown : NumericUpDown { public event EventHandler<MyNumericUpDownButtonClickedEventArgs> ButtonClicked; public override void UpButton() { var oldvalue = Value; base.UpButton(); OnButtonClicked(MyNumericUpDownButton.Up, oldvalue); }
public override void DownButton() { var oldvalue = Value; base.DownButton(); OnButtonClicked(MyNumericUpDownButton.Down, oldvalue); }
private void OnButtonClicked(MyNumericUpDownButton button, decimal oldValue) { var handler = ButtonClicked; if(handler != null) handler(this, new MyNumericUpDownButtonClickedEventArgs() { Button = button, OldValue = oldValue, NewValue = Value }); } } |
Für diesen Beitrag haben gedankt: okrim
|
|
okrim 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: Di 13.05.14 19:40
Hallo Ralf,
das klappt ja auch immer wenn ich die Wochen zahl erhöhe kommt nach der 52. oder 53. Woche immer die 1. Woche, nur beim zurück zählen kommt ja nach der 1. Woche die 52. oder 53. Je nach dem, auch das klappt immer, außer wenn das Vorjahr 53 Wochen hat dann kann ich nach unten Klicken wie ich will es bleibt immer die 1.
Was mir ja auch einleuchtet hier das Beispiel
C#-Quelltext 1: 2: 3: 4: 5:
| if (numericUpDown_woche.Value > 52) { numericUpDown_woche.Value = 1; numericUpDown_jahr.Value++; } |
C#-Quelltext 1: 2: 3: 4: 5:
| if (numericUpDown_woche.Value < 1 { numericUpDown_woche.Value = 53; numericUpDown_jahr.Value--; } |
wenn ich jetzt eine 1 drin stehen habe und einmal nach unten Klicke sollte ja die 53 kommen aber mit der oberen if abfrage kommt ja wieder die 1 da ja die 53 größer ist als die 52 usw.
Oder stelle ich mich mal wieder total blöd an und blicke es gerade mal wieder nicht?
Gruß Mirko
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 13.05.14 19:54
In welchen Event hast du den den Code gepackt? Click?
Für diesen Beitrag haben gedankt: okrim
|
|
okrim 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: Di 13.05.14 19:59
In ValueChanged
hier ein Beispiel
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void numericUpDown1_ValueChanged(object sender, EventArgs e) { if (numericUpDown_woche.Value > 52) { numericUpDown_woche.Value = 1; }
if (numericUpDown_woche.Value < 1) { numericUpDown_woche.Value = 53; } } } } |
wenn ich jetzt statt der 53 die 52 eintrage dann funktioniert es, nur so geht es leider nicht.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 13.05.14 20:11
Ah. Den Value in ValueChanged ändern löst den Event natürlich nochmal aus.
Häng den EventHandler ab wenn du Value änderst damit der nicht nochmal ausgelöst wird.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void numericUpDown1_ValueChanged(object sender, EventArgs e) { numericUpDown1.ValueChanged -= numericUpDown1_ValueChanged; try { } finally { numericUpDown1.ValueChanged += numericUpDown1_ValueChanged; } } |
Hast das Control auf ReadOnly gesetzt? Sonst wird ValueChanged natürlich auch beim direkten editieren aufgerufen und ruft vielleicht noch andere unerwünschte Effekte aus.
Für diesen Beitrag haben gedankt: okrim
|
|
okrim 
      
Beiträge: 82
Win 7
C# (VS 2010 Express)
|
Verfasst: Di 13.05.14 20:28
Danke Ralf,
jetzt geht es
ich bin so froh das es dieses Super Forum
Gruß Mirko
|
|