目前,在使用datetimepicker时,在您输入月份后,您必须点击右箭头或“/”才能进入当天。是否有我可以设置的属性或知道月份已完成的方式并移至当天并在用户完成当天之后移动到当年?这与使用旧FoxPro / Clipper时编写的应用程序的行为相同。
答案 0 :(得分:10)
正如@Wael Dalloul所说,没有财产可以做你想要的。经过大量的小提琴和Spy ++工作后,我找到了以下解决方案:
继承System.Windows.Forms.DateTimePicker
,并为标志声明私有字段:
public class DPDateTimePicker : DateTimePicker
{
private bool selectionComplete = false;
private bool numberKeyPressed = false;
为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语句。
覆盖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);
}
覆盖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);
}
覆盖OnKeyUp
,如果同时设置了两个标记并且按下的键是一个数字,请手动调用base.WndProc
WM_KEYDOWN
后跟WM_KEYUP
{{}} {1}},然后清除你的旗帜。您可以将这些消息的Keys.Right
设置为0而不用担心,lParam
当然是HWnd
。
this.Handle
对于代码中缺少空行感到抱歉,但它不会显示空白行,所以我把它们拿出来了。相信我,这是更易阅读的版本。
答案 1 :(得分:2)
它适用于winforms datetimepicker
关于值更改事件粘贴以下代码
sendkeys.send(".");
答案 2 :(得分:0)
没有属性让它像您想要的那样工作,我认为您必须处理按键事件并通过代码执行。