2010-03-08 4 views
5

현재 datetimepicker를 사용할 때 월을 입력 한 후에는 오른쪽 화살표 나 "/"를 눌러 해당 날짜로 이동해야합니다. 제가 설정할 수있는 자산이 있습니까, 아니면 그 달이 끝났음을 알 수있는 방법이 있습니까? 그리고 그 날로 이동 한 후 그 해로 이동하십시오. 이는 이전 FoxPro/Clipper 시절에 작성된 응용 프로그램과 동일한 동작입니다.DateTimePicker가 자동으로 다음 datepart로 이동합니다.

답변

0

속성이 없습니다. 원하는대로 작동하게하려면 키 누르기 이벤트를 처리하고 코드로 처리해야한다고 생각합니다.

7

@Wael Dalloul이 말했듯이, 당신이 원하는 것을 할 수있는 재산이 없습니다.

  1. 플래그 민간 분야를 System.Windows.Forms.DateTimePicker에서 상속 및 선언 :

    public class DPDateTimePicker : DateTimePicker 
    { 
        private bool selectionComplete = false; 
        private bool numberKeyPressed = false; 
    
  2. 승 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; 
        }  
    

    그것은 승리의 API를 사용하기 위해 System.Runtime.InteropServices에 대한 using 문을 포함 할 필요합니다.

  3. 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); 
    } 
    
  4. 재정 WndProc 및 트랩 WM_REFLECT+WM_NOTIFY 메시지는 코드가 -759 인 경우는 NMHDRlParam에서, 다음 (이 이벤트가 완전히 키보드에 가득 필드 중 하나 후에 트리거 다른 플래그를 설정 추출 날짜가 선택됨).

    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); 
    } 
    
  5. 재정 OnKeyUp 두 플래그를 설정하고 누른 키를 수동으로 다음 플래그를 취소 Keys.RightWM_KEYUP 다음에 WM_KEYDOWNbase.WndProc 전화, 숫자였다 경우. 이 메시지 중 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; 
        } 
    } 
    
  6. 코드에 빈 줄의 부족에 대한

죄송하지만, 바로 빈 줄이 표시되지 것입니다, 그래서 그들을했다. 저를 신뢰하십시오, 이것은 더 읽을 수있는 버전입니다.

1

그것은 아래의 코드

sendkeys.send("."); 
를 붙여 값 변경 이벤트에있는 DateTimePicker

윈폼에서 작동합니다

관련 문제