Entwickler-Ecke

WinForms - Focus auf Tag im DateTimePicker setzen


Scofield2011 - So 06.10.13 19:36
Titel: Focus auf Tag im DateTimePicker setzen
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.


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 - 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.


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;
    }
}