2011-11-27 69 views
1

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

+1

Web,Windows Forms,Silverlight,WPF,Windows Phone? –

+0

这是什么意思? –

+0

Windows Forms,W7; 我的意思是在datetimepicker右侧的箭头,它打开日期选择器(http://en.csharp-online.net/images/3/3b/526_111.jpg) – sczdavos

回答

0

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

因此,在右键单击时,您必须先将ShowUpDown设置为false,然后显示日历。要再次显示上下文,请在ValueChanged和datetime选取器的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; 
} 
+0

谢谢,这就是我想要的,我只使用而不是ValueChanged - > CloseUp和SendKeys.Send(“%{down}”); – sczdavos

1

你必须发送一个Windows消息到按钮或控件,它不会被控件暴露。

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

1

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

所以在keypress,keydown事件和点击事件上查看参考资料。

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

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

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

编辑:我假设你是继承控件。

2

实现DateTimePicker的本地Windows控件具有很少的花里胡哨的功能。您可以发送一条消息强制关闭下拉日历,但没有人强制打开它。这需要获取原油,下拉菜单可以通过按键Alt + Down打开。这使得该事件处理MouseUp事件工作:

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

它是可靠的,焦点始终是在这种情况下很好。