【问题标题】:C# datetime picker -> use updown & pickC# 日期时间选择器 -> 使用 updown & pick
【发布时间】:2011-11-27 00:02:59
【问题描述】:

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

【问题讨论】:

  • Web、Windows 窗体、Silverlight、WPF、Windows Phone?
  • 这里的箭头是什么意思?
  • Windows 窗体,W7;我的意思是 datetimepicker 右侧的箭头,它打开日期选择器 (en.csharp-online.net/images/3/3b/526_111.jpg)
  • 简单 -> 如果我右键单击日期时间选择器,我想显示下拉日历(日期选择器或者这个名称)

标签: c# datetimepicker


【解决方案1】:

实现 DateTimePicker 的本机 Windows 控件几乎没有花里胡哨。您可以发送一条消息来强制关闭下拉日历,但没有一条消息可以强制打开它。这要求变得粗略,可以通过击键 Alt+Down 打开下拉菜单。这使得 MouseUp 事件的这个事件处理程序起作用:

    private void dateTimePicker1_MouseUp(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Right) SendKeys.Send("%{down}");
    }

这是可靠的,在这种情况下专注总是好的。

【讨论】:

    【解决方案2】:

    您必须向按钮或控件发送 Windows 消息,它不会被控件公开。

    This article 有一个很好的模拟按钮按下的例子。

    【讨论】:

      【解决方案3】:

      在一般意义上,您正在谈论绑定到事件。在这种情况下,您有兴趣绑定到键盘和鼠标事件。

      因此,请查找有关按键、按键事件和单击事件的参考资料。

      在按键事件中,您可以通过向上/向下键过滤您感兴趣的按键类型或组合键。

      在 click 事件处理程序中,您将检查哪个鼠标按钮被按下(左键和右键等等)。

      捕获并过滤感兴趣的事件后,您只需触发日期时间选择器上的下拉操作即可。要显示日历,您可以在 datetimepicker 上调用 InvokeOnClick。

      编辑:我假设您正在对控件进行子类化。

      【讨论】:

        【解决方案4】:

        有一种方法可以做到这一点,但它有点小技巧(我不太喜欢它)。正如已经指出的那样,您可以使用SendMessage 弹出日历,但是当ShowUpDown 为真时(我知道您所拥有的),这不起作用。

        因此,在右键单击时,您必须先将 ShowUpDown 设置为 false,然后再显示日历。要再次显示上下,请在日期时间选择器的 ValueChanged 和 Leave 事件中将 ShowUpDown 设置为 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;
        }
        

        【讨论】:

        • 谢谢,这正是我想要的,我只使用而不是 ValueChanged -> CloseUp 和 SendKeys.Send("%{down}");
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多