DateTimePicker自动移动到下一个datepart

时间:2010-03-08 08:02:21

标签: .net datetimepicker

目前,在使用datetimepicker时,在您输入月份后,您必须点击右箭头或“/”才能进入当天。是否有我可以设置的属性或知道月份已完成的方式并移至当天并在用户完成当天之后移动到当年?这与使用旧FoxPro / Clipper时编写的应用程序的行为相同。

3 个答案:

答案 0 :(得分:10)

正如@Wael Dalloul所说,没有财产可以做你想要的。经过大量的小提琴和Spy ++工作后,我找到了以下解决方案:

  1. 继承System.Windows.Forms.DateTimePicker,并为标志声明私有字段:

    public class DPDateTimePicker : DateTimePicker
    {
        private bool selectionComplete = false;
        private bool numberKeyPressed = false;
    
  2. 为Win API定义常量和结构:

        private const int WM_KEYUP = 0x0101;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_REFLECT = 0x2000;
        private const int WM_NOTIFY = 0x004e;
    
        [StructLayout(LayoutKind.Sequential)]
        private struct NMHDR
        {
           public IntPtr hwndFrom;
           public IntPtr idFrom;
           public int Code;
        }    
    

    为了使用Win API,还必须包含System.Runtime.InteropServices的using语句。

  3. 覆盖OnKeyDown并根据按下的键是否为数字设置或清除标记(并清除下面的第二个标记)。

    protected override void OnKeyDown(KeyEventArgs e)
    {
        numberKeyPressed = (e.Modifiers == Keys.None && ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode != Keys.Back && e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9)));
        selectionComplete = false;
        base.OnKeyDown(e);
    }
    
  4. 覆盖WndProc并捕获WM_REFLECT+WM_NOTIFY消息,从NMHDR中提取lParam,如果代码为-759则设置另一个标记(此事件为用键盘完全填写其中一个字段并选择日期后触发。

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_REFLECT + WM_NOTIFY)
        {
            var hdr = (NMHDR)m.GetLParam(typeof(NMHDR));
            if (hdr.Code == -759) //date chosen (by keyboard)
                selectionComplete = true;
        }
        base.WndProc(ref m);
    }
    
  5. 覆盖OnKeyUp,如果同时设置了两个标记并且按下的键是一个数字,请手动调用base.WndProc WM_KEYDOWN后跟WM_KEYUP {{}} {1}},然后清除你的旗帜。您可以将这些消息的Keys.Right设置为0而不用担心,lParam当然是HWnd

    this.Handle
  6. 对于代码中缺少空行感到抱歉,但它不会显示空白行,所以我把它们拿出来了。相信我,这是更易阅读的版本。

答案 1 :(得分:2)

它适用于winforms datetimepicker

关于值更改事件粘贴以下代码

sendkeys.send(".");

答案 2 :(得分:0)

没有属性让它像您想要的那样工作,我认为您必须处理按键事件并通过代码执行。