2011-11-27 102 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}"); 
    } 

它是可靠的,焦點始終是在這種情況下很好。