Autor Beitrag
okrim
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: 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.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
            // Springt nach der letzten Woche auf Woche 1
            if (numericUpDown_woche.Value > anzahl_Weeks)
            {
                numericUpDown_woche.Value = 1;
                numericUpDown_jahr.Value++;
            }

            // Springt nach Woche 1 auf Woche 52 oder 53
            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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Di 13.05.14 18:32 
Hallo Christian,

erst mal Danke für deine Antwort.
Das Problem ist folgendes:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
            // Springt nach der letzten Woche auf Woche 1
            if (numericUpDown_woche.Value > anzahl_Weeks) // z.B.: anzahl_Weeks 52 Wochen wenn der Wert grösser ist wird eine 1 eingetragen
            {
                numericUpDown_woche.Value = 1;
                numericUpDown_jahr.Value++;
            }

            // Springt nach Woche 1 auf Woche 52 oder 53
            if (numericUpDown_woche.Value < 1// Wenn ich 1 drin stehen habe und Pfeil nach unten Klicke soll 53 kommen, da aber 53 ja grösser ist als 52 kommt
                                               // durch die obere if Abfrage wieder 1, somit steht immer 1 drin
            {
                numericUpDown_woche.Value = anzahl_Weeks_vorjahr; // z.B.: anzahl_Weeks_vorjahr 53 Wochen
                numericUpDown_jahr.Value--;
            }


Das mit dem Vergleich ist ne super Idee, ich werde mal versuchen ob ich das hinbekomme.

Gruß Mirko
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4803
Erhaltene Danke: 1060

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden volle Höhe C#-Quelltext
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(thisnew MyNumericUpDownButtonClickedEventArgs() { Button = button, OldValue = oldValue, NewValue = Value });
    }
}

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: 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

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
            if (numericUpDown_woche.Value > 52// ist Wochen vom aktuellen Jahr (anzahl_Weeks)
            {
                numericUpDown_woche.Value = 1;
                numericUpDown_jahr.Value++;
            }



ausblenden C#-Quelltext
1:
2:
3:
4:
5:
            if (numericUpDown_woche.Value < 1
            {
                numericUpDown_woche.Value = 53// ist Wochen vom Vorjahr (anzahl_Weeks_vorjahr)
                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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 13.05.14 19:54 
In welchen Event hast du den den Code gepackt? Click?

Für diesen Beitrag haben gedankt: okrim
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Di 13.05.14 19:59 
In ValueChanged


hier ein Beispiel

ausblenden volle Höhe C#-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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
    {
        //hier kannst du Value ändern
    }
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Di 13.05.14 20:28 
Danke Ralf,

jetzt geht es :D

ich bin so froh das es dieses Super Forum

Gruß Mirko