Autor Beitrag
Scofield2011
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: So 06.10.13 19:36 
Hallo,

ich hättte da mal eine Frage:

Also ich habe in meiner Form zwei DateTimePicker mit der Option ShowUpDown = true. Nun soll beim Betätigen stets der Tag und nicht der Monat oder das Jahr geändert warden. Verwendet man ein deutsches Datumsformat ist das auch kein Problem, nur leider ist das Datum im Format MM/dd/yyyy erforderlich.

Wenn ich also jetzt auf den Up oder Down Spinner klicke, wird immer (ohne Änderung des Cursors) der Monat geändert, was nicht das gewünschte Verhalten ist.

Im Internet habe ich den folgenden Code gefunden und ihn mit dem Enter Ereignis der DateTimePicker verbunden.

ausblenden C#-Quelltext
1:
SendKeys.Send("{RIGHT 1}");					


Das Problem bei dem Enter Ereignis ist, dass es scheinbar erst eintritt, wenn der Wert des Monats schon verändert wurde. Es funktioniert also erst ab dem zweiten Klick.

Ich habe schon mehrere Ereignisse ausprobiert, aber noch keines gefunden, dass das gewünschte Verhalten erzeugt.

Ich hoffe ihr könnt mir weiter helfen. Vielleicht gibt es ja auch eine andere Möglichkeit.

Vielen Dank schon einmal im Voraus.

Scofield2011
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: So 06.10.13 21:02 
Da muss man scheinbar in den Common Controls untiefen schrauben :(
Bedenke der folgende abgeleitete DateTimePicker fängt nur die UpDown Buttons ab. Über das Keyboard kann man immer noch beliebig ändern.

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:
39:
40:
41:
42:
43:
44:
public class UpDownDayDateTimePicker : DateTimePicker
{
    private const Int32 WM_NOTIFY = 0x4E;
    private const Int32 UDN_DELTAPOS = -722;

    public MyDateTimePicker() : base()
    {
        ShowUpDown = true;
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_NOTIFY)
        {
            NMHDR nmHdr = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
            if (nmHdr.code == UDN_DELTAPOS)
            {
                NMUPDOWN nmUpDown = (NMUPDOWN)Marshal.PtrToStructure(m.LParam, typeof(NMUPDOWN));
                if (nmUpDown.delta < 0
                    Value = Value.AddDays(-1);
                else 
                    Value = Value.AddDays(1);
                return;
            }
        }
        base.WndProc(ref m);
    }

    [StructLayout(LayoutKind.Sequential)]
    struct NMHDR // WinUser.h - typedef struct tagNMHDR
    {
        public IntPtr hwndFrom;
        public IntPtr idFrom;
        public int code;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct NMUPDOWN  // Commctrl.h - typedef struct _NM_UPDOWN
    {
        public NMHDR hdr;
        public int pos;
        public int delta;
    }
}