我有日期时间选择器,我想使用updown和箭头来选择日期(下拉日历),或者如果我右键单击日期时间选择器,日期选择器(下拉日历)将显示。 我怎么能这样做?
答案 0 :(得分:2)
实现DateTimePicker的本机Windows控件只有很少的花里胡哨。您可以发送一条消息强制关闭下拉日历,但没有人强制打开它。这要求获得原油,可以通过按键Alt + Down打开下拉菜单。这使MouseUp事件的事件处理程序工作:
private void dateTimePicker1_MouseUp(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Right) SendKeys.Send("%{down}");
}
这是可靠的,在这种情况下,重点始终是好的。
答案 1 :(得分:1)
您必须向按钮或控件发送一条Windows消息,它不会被控件暴露。
This article有一个模拟按钮按下的好例子。
答案 2 :(得分:1)
从一般意义上说,你所说的是对事件的约束。在这种情况下,您有兴趣绑定键盘和鼠标事件。
请查看关于按键,keydown事件和点击事件的参考资料。
在按键事件中,您可以使用向上/向下键过滤您感兴趣的键或键组合类型。
在点击事件处理程序中,您将检查按住哪个鼠标按钮(左右等等)。
一旦捕获并过滤了感兴趣的事件,您就可以触发日期时间选择器上的下拉操作。要显示日历,您可以在datetimepicker上调用InvokeOnClick。
编辑:我假设你正在对控件进行子类化。答案 3 :(得分:0)
有一种方法可以做到这一点,但这有点像黑客(我不会太喜欢)。正如已经指出的那样,您可以使用SendMessage
弹出日历,但是当ShowUpDown
为真时(我理解的是您所拥有的),这不起作用。
因此,在右键单击时,您必须先将ShowUpDown设置为false,然后显示日历。要再次显示上下调,请在ValueChanged中将ShowUpDown
设置为true,并将日期时间选择器的Leave事件设置为true。
[DllImport("user32.dll", SetLastError = true)]
private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
private const uint WM_SYSKEYDOWN = 0x104;
void dateTimePicker1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
this.dateTimePicker1.ShowUpDown = false;
SendMessage(dateTimePicker1.Handle, WM_SYSKEYDOWN, (int)Keys.Down, 0);
}
else
{
this.dateTimePicker1.ShowUpDown = true;
}
}
// Connect this to ValueChanged and Leave events.
private void resetDateTimePickerShowUpDown(object sender, EventArgs e)
{
this.dateTimePicker1.ShowUpDown = true;
}