當前,使用datetimepicker時,輸入月份後必須按右箭頭或「/」移動到當天。是否有我可以設置的屬性或一種方法來知道該月完成並移動到當天,並在用戶完成一天之後移動到一年?這與在舊的FoxPro/Clipper日子中編寫的應用程序的行爲相同。DateTimePicker自動移動到下一個日期部分
5
A
回答
0
沒有屬性使它像你想要的那樣工作,我認爲你必須處理按鍵事件並通過代碼來完成。
7
正如@Wael Dalloul所說,沒有財產去做你想做的事。大量的小提琴演奏和Spy ++的工作後,我來到了以下解決方案:
從
System.Windows.Forms.DateTimePicker
繼承,並聲明私有字段標誌:public class DPDateTimePicker : DateTimePicker { private bool selectionComplete = false; private bool numberKeyPressed = false;
定義爲Win API常量和結構:
private const int WM_KEYUP = 0x0101; private const int WM_KEYDOWN = 0x0100; private const int WM_REFLECT = 0x2000; private const int WM_NOTIFY = 0x004e; [StructLayout(LayoutKind.Sequential)] private struct NMHDR { public IntPtr hwndFrom; public IntPtr idFrom; public int Code; }
這也是必要的,包括爲了用Win API using語句爲
System.Runtime.InteropServices
。重寫
OnKeyDown
並根據按下的鍵是否是數字(並清除下面的第二個標誌)來設置或清除標誌。protected override void OnKeyDown(KeyEventArgs e) { numberKeyPressed = (e.Modifiers == Keys.None && ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode != Keys.Back && e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))); selectionComplete = false; base.OnKeyDown(e); }
覆蓋
WndProc
和陷阱WM_REFLECT+WM_NOTIFY
消息,提取NMHDR
從lParam
,然後設置另一個標誌,如果該代碼爲-759(該事件中的一個字段與所述鍵盤被完全填充在後觸發日期被選中)。protected override void WndProc(ref Message m) { if (m.Msg == WM_REFLECT + WM_NOTIFY) { var hdr = (NMHDR)m.GetLParam(typeof(NMHDR)); if (hdr.Code == -759) //date chosen (by keyboard) selectionComplete = true; } base.WndProc(ref m); }
覆蓋
OnKeyUp
如果兩個標誌設置和按下的鍵是一個數字,手動調用base.WndProc
與WM_KEYDOWN
接着用Keys.Right
一個WM_KEYUP
,然後清除標誌。您可以將這些消息的lParam
設置爲0而不用擔心,而HWnd
當然是this.Handle
。protected override void OnKeyUp(KeyEventArgs e) { base.OnKeyUp(e); if (numberKeyPressed && selectionComplete && (e.Modifiers == Keys.None && ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode != Keys.Back && e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9)))) { Message m = new Message(); m.HWnd = this.Handle; m.LParam = IntPtr.Zero; m.WParam = new IntPtr((int)Keys.Right); //right arrow key m.Msg = WM_KEYDOWN; base.WndProc(ref m); m.Msg = WM_KEYUP; base.WndProc(ref m); numberKeyPressed = false; selectionComplete = false; } }
道歉缺乏代碼空行,但它不會正確使用空行顯示,所以我就拿出來。相信我,這是更可讀的版本。
1
它將在WinForms的價值變化事件的DateTimePicker
粘貼下面的代碼
sendkeys.send(".");
工作
相關問題
- 1. 整頁瀏覽單滾動移動到下一部分
- 2. 移動給定的部分到下一個可用空間
- 3. 刷卡內容移動到iphone上的下一個部分
- 4. 自動分類日期Coloumn
- 5. 拖動一個UIView部分路徑,然後它自己移動
- 6. 自動滾動到部分
- 7. 不移動到下一個活動
- 8. 停止自動進入下一個/上個月Datetimepicker
- 9. 遊標不會自動移動到下一個TextField
- 10. 在UWP中自動移動光標到下一個文本框
- 11. 自動移動到下一個編輯文本字段android
- 12. 移動到下一個活動,不殺死前一個活動
- 13. jQuery滾動到頂部並滾動到下一部分
- 14. 從一個部分移動的UITableViewCell到另一個程序
- 15. 將紋理數據從一個紋理部分移動到另一個部分
- 16. 分頁無法移動下一個
- 17. 將部分移動到下一頁Crystal Report
- 18. 從datetimepicker中選擇一個日期
- 19. 設置DateTimePicker的最小日期爲另一個DateTimePicker的選定日期
- 20. 今天自動設置日期並設置另一個日期到期
- 21. 移動XAML文件的一部分到另一個XAML文件
- 22. 移動功能的一部分到另一個函數
- 23. 自動滾動到下一個/上一個單元格滑動
- 24. 移動一行到頂部
- 25. 在日期過後,自動將Wordpress帖子從一個頁面移動到另一個頁面
- 26. 將行的一部分移動到第二行,將行的一部分移動到第三行
- 27. iText移動到下一頁
- 28. 在Android中從一個活動移動到下一個
- 29. 下一個移動表到圖像
- 30. React.js移動到下一個列表