2010-03-11 14 views

답변

7

다음

//part of the usings 
using System.Runtime.InteropServices; 

//declares 
[DllImport("user32.dll")] 
private static extern bool PostMessage(
IntPtr hWnd, // handle to destination window 
Int32 msg, // message 
Int32 wParam, // first message parameter 
Int32 lParam // second message parameter 
); 

const Int32 WM_LBUTTONDOWN = 0x0201; 

//method to call dropdown 
private void button1_Click(object sender, EventArgs e) 
{ 
    Int32 x = dateTimePicker1.Width - 10; 
    Int32 y = dateTimePicker1.Height/2; 
    Int32 lParam = x + y * 0x00010000; 

    PostMessage(dateTimePicker1.Handle, WM_LBUTTONDOWN, 1,lParam); 

} 
+0

이것은 Windows 7 또는 .NET35에서 깨진 것 같습니다. 캘린더가 팝업되지만 응답하지 않습니다. 컨트롤을 가리키면 아무 것도 수행되지 않으며 날짜를 클릭하면 달력이 사라지지만 DateTimePicker 컨트롤의 .Value는 업데이트되지 않습니다. –

+0

어둠의 마법! 일. 고마워! – fnc12

2

신용이 아주 좋은 확장하게 솔루션을 제공하기 위해 astander로 이동하십시오 :

using System.Linq; 
using System.Runtime.InteropServices; 

public static class Extensions { 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern int PostMessage(IntPtr hwnd, Int32 wMsg, Int32 wParam, Int32 lParam); 

    public static void Open(this DateTimePicker obj) { 
    const int WM_LBUTTONDOWN = 0x0201; 
    int width = obj.Width - 10; 
    int height = obj.Height/2; 
    int lParam = width + height * 0x00010000; // VooDoo to shift height 
    PostMessage(obj.Handle, WM_LBUTTONDOWN, 1, lParam); 
    } 

} 

사용법 :

dateTimePicker1.Open(); 

이 방법을 사용하면 언제든지 DateTimePicker 컨트롤을 사용하여 언제든지 Extension을 다시 사용할 수 있습니다.

여러분 중 일부는 유용하다는 것을 알기를 바랍니다.

~ 조

+1

하하하, 부두가 재미있었습니다. – Henrique

3

내 시스템 (Windows 7, .NET 35)에서는 다른 해결책이 작동하지 않았습니다. 나는 MS 토론 사이트에서 또 다른 해결책을 발견했다.

using System.Runtime.InteropServices; 

public static class Extensions 
{ 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 

    private const uint WM_SYSKEYDOWN = 0x104; 

    public static void Open(this DateTimePicker obj) 
    { 
     SendMessage(obj.Handle, WM_SYSKEYDOWN, (int)Keys.Down, 0); 
    } 
} 

출처 : http://social.msdn.microsoft.com/Forums/windows/en-US/f2f0b213-d57a-46de-b924-e21b7ac0882e/programmatically-open-the-calendar-of-the-datetimepicker-control?forum=winforms

사용법 :

dateTimePicker1.Open(); 

경고. dateTimePicker1DataGridView의 컨트롤 인 경우 (즉, DGV에서 팝업 DatePicker를 만들려고 시도하는 경우)이 기능은 작동하지 않습니다. 컨트롤이 Form에 추가 된 경우 작동합니다. 그러면 합성 커서 "아래로"이벤트가 DGV에 의해 삼켜지고 DTP의 달력을 드롭 드롭하는 대신 현재 셀 포인터를 아래로 움직입니다.

관련 문제