C#datetime picker - >使用updown&挑

时间:2011-11-27 00:02:59

标签: c# datetimepicker

我有日期时间选择器,我想使用updown和箭头来选择日期(下拉日历),或者如果我右键单击日期时间选择器,日期选择器(下拉日历)将显示。 我怎么能这样做?

4 个答案:

答案 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;
}