В настоящее время, при использовании datetimepicker после ввода месяца, необходимо или поразить стрелку вправо или "/", чтобы это переместилось в день. Существует ли свойство, которое я могу установить или способ знать, что месяц сделан, и переместитесь в день и переместитесь в то, через год после того, как пользователь сделан со днем? Это - то же поведение с приложениями, записанными в старые дни FoxPro/Clipper.
Нет Property, чтобы заставить его работать так, как вы хотите, я думаю, вам придется обрабатывать событие нажатия клавиши и делать это с помощью кода.
Как говорит @Wael Dalloul, нет права делать то, что вы хотите. После долгой работы и работы со Spy ++ я пришел к следующему решению:
Наследование от System.Windows.Forms.DateTimePicker
и объявление частных полей для флагов:
открытый класс DPDateTimePicker: DateTimePicker
{
private bool selectionComplete = false;
private bool numberKeyPressed = false;
Определение констант и структур для 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.
Переопределить 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 (е);
}
Переопределите 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 (ссылка м);
}
Переопределите 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;
}
}
Приносим извинения за отсутствие пустых строк в коде, но он не отображался вместе с пустыми строками, поэтому я удалил их. Поверьте, это более читаемая версия.