Я недавно вновь обратился к этой проблеме, потому что реализация, предоставленная 0A0D, не всегда хорошо сочеталась с навигацией клавиатуры по сетке (стрелки / табуляция). Время от времени можно было обойти DateTimePicker
и ввести текст в DataGridViewTextBoxCell
. Это привело к тому, что моя логика проверки вышла из-под контроля; и после того, как я не смог найти способ предотвратить возникновение промахов, я решил попытаться снова заставить работать пользовательский столбец.
Исправление оказалось очень простым. Я создал расширенный DateTimePicker
с методом для отправки нажатия клавиши, необходимой для отображения календаря.
/// <summary>
/// Extended DateTimePicker with a method to programmatically display the calendar.
/// </summary>
class DateTimePickerEx : DateTimePicker
{
[DllImport("user32.dll")]
private static extern bool PostMessage(
IntPtr hWnd, // handle to destination window
Int32 msg, // message
Int32 wParam, // first message parameter
Int32 lParam // second message parameter
);
const Int32 WM_LBUTTONDOWN = 0x0201;
/// <summary>
/// Displays the calendar input control.
/// </summary>
public void ShowCalendar()
{
Int32 x = Width - 10;
Int32 y = Height / 2;
Int32 lParam = x + y * 0x00010000;
PostMessage(Handle, WM_LBUTTONDOWN, 1, lParam);
}
}
Затем я изменил пример столбца MSDN DateTime , чтобы CalendarEditingControl
наследовал от DateTimePickerEx
.
Затем в форме размещения DataGridView
я использовал свойство EditingControl
для вызова метода ShowCalendar()
.
DateTimePickerEx dtp = myDataGridView.EditingControl as DateTimePickerEx;
if (dtp != null)
dtp.ShowCalendar();