2010-03-11 17 views

Respuesta

7

Prueba el crédito siguiente

//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

Esto parece estar roto en Windows 7 o .NET35. El calendario aparece, pero no responde. Al pasar el control sobre el control no se hace nada, y al hacer clic en una fecha, el calendario desaparece pero no actualiza el valor .Value del control DateTimePicker. –

+0

¡Un poco de magia oscura! Works.Thanks! – fnc12

2

va a astander para proporcionar la solución, lo que hace un muy buen extensión:

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); 
    } 

} 

Uso:

dateTimePicker1.Open(); 

De esta forma, puede reutilizar su extensión cada vez que lo desee, una y otra vez, de cualquier forma, utilizando cualquier control DateTimePicker.

Espero que algunos de ustedes encuentren útil ese simple truco.

~ Joe

+1

jajaja, VooDoo era gracioso – Henrique

3

En mi sistema (Windows 7, .NET 35) las otras soluciones no funcionaron. Encontré otra solución en un sitio de discusión de MS que funcionó.

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); 
    } 
} 

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

de uso:

dateTimePicker1.Open(); 

advertencias. Esto no funcionará si el dateTimePicker1 es un Control en DataGridView (es decir, si intenta hacer un DatePicker emergente en el DGV). Funciona si el control se agrega al Form en su lugar. Lo que sucederá es que el evento de "abajo" del cursor sintetizado será absorbido por el DGV, y moverá el puntero de celda actual hacia abajo en lugar de soltar el Calendario del DTP.

Cuestiones relacionadas