我最近重新审视了这个问题,因为 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();