DateTimePicker автоматически перемещаются в следующий datepart

В настоящее время, при использовании datetimepicker после ввода месяца, необходимо или поразить стрелку вправо или "/", чтобы это переместилось в день. Существует ли свойство, которое я могу установить или способ знать, что месяц сделан, и переместитесь в день и переместитесь в то, через год после того, как пользователь сделан со днем? Это - то же поведение с приложениями, записанными в старые дни FoxPro/Clipper.

6
задан Leon Tayson 8 March 2010 в 08:02
поделиться

2 ответа

Нет Property, чтобы заставить его работать так, как вы хотите, я думаю, вам придется обрабатывать событие нажатия клавиши и делать это с помощью кода.

0
ответ дан 8 December 2019 в 18:35
поделиться

Как говорит @Wael Dalloul, нет права делать то, что вы хотите. После долгой работы и работы со Spy ++ я пришел к следующему решению:

  1. Наследование от System.Windows.Forms.DateTimePicker и объявление частных полей для флагов:

     открытый класс DPDateTimePicker: DateTimePicker
    {
    private bool selectionComplete = false;
    private bool numberKeyPressed = false;
    
  2. Определение констант и структур для Win API:

      private const int WM_KEYUP = 0x0101;
    приватная константа int WM_KEYDOWN = 0x0100;
    частный const int WM_REFLECT = 0x2000;
    приватная константа int WM_NOTIFY = 0x004e;
    
     [StructLayout (LayoutKind.Sequential)]
    частная структура NMHDR
     {
    общедоступный IntPtr hwndFrom;
    общедоступный IntPtr idFrom;
    общедоступный код int;
     }
    

    Также необходимо включить оператор using для System.Runtime.InteropServices , чтобы использовать Win API.

  3. Переопределить OnKeyDown и установить или сбросить флаг в зависимости от того, была ли нажатая клавиша числом (и сбросить второй флаг ниже).

     защищенное переопределение недействительным OnKeyDown (KeyEventArgs e)
    {
    numberKeyPressed = (e.Modifiers == Keys.None && ((e.KeyCode> = Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode! = KeysBack && e.KeyCode> = Keys .NumPad0 && e.KeyCode <= Keys.NumPad9)));
    selectionComplete = false;
    base.OnKeyDown (е);
    }
    
  4. Переопределите WndProc и перехватите сообщение WM_REFLECT + WM_NOTIFY , извлеките NMHDR из lParam , затем установите другой флаг, если код - -759 (это событие запускается после того, как одно из полей полностью заполнено с клавиатуры и выбрана дата).

     защищенное переопределение void WndProc (ссылка на сообщение m)
    {
    если (m.Msg == WM_REFLECT + WM_NOTIFY)
     {
    var hdr = (NMHDR) m.GetLParam (typeof (NMHDR));
    if (hdr.Code == -759) // дата выбрана (с клавиатуры)
    selectionComplete = true;
     }
    base.WndProc (ссылка м);
    }
    
  5. Переопределите OnKeyUp , и если установлены оба флага и нажатая клавиша была числом, вручную вызовите base.WndProc с WM_KEYDOWN , за которым следует ] WM_KEYUP с помощью Keys.Right , затем снимите флажки. Вы можете установить для lParam этих сообщений значение 0 и не беспокоиться об этом, а HWnd , конечно же, this.Handle .

     защищенное переопределение недействительным OnKeyUp (KeyEventArgs e)
    {
    base.OnKeyUp (e);
    if (numberKeyPressed && selectionComplete &&
     (e.Modifiers == Keys.None && ((e.KeyCode> = Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode! = Keys.Back && e.KeyCode> = Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))))
     {
    Сообщение m = новое сообщение ();
    m.HWnd = this.Handle;
    m.LParam = IntPtr.Zero;
    m.WParam = новый IntPtr ((int) Keys.Right); // клавиша со стрелкой вправо
    m.Msg = WM_KEYDOWN;
    base.WndProc (ссылка м);
    m.Msg = WM_KEYUP;
    base.WndProc (ссылка м);
    numberKeyPressed = false;
    selectionComplete = false;
     }
    }
    

Приносим извинения за отсутствие пустых строк в коде, но он не отображался вместе с пустыми строками, поэтому я удалил их. Поверьте, это более читаемая версия.

11
ответ дан 8 December 2019 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: