2010-03-11 6 views

Répondre

7

Essayez les méthodes suivantes

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

Cela semble être cassé sur Windows 7 ou .NET35. Le calendrier apparaît, mais il n'est pas réactif. Passer la souris sur le contrôle ne fait rien, et lorsque vous cliquez sur une date, le calendrier disparaît mais ne met pas à jour le .Value du contrôle DateTimePicker. –

+0

Kinda magie noire! Travaux. Merci! – fnc12

2

Le crédit va à astander pour fournir la solution, ce qui en fait une extension très agréable:

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

} 

Utilisation:

dateTimePicker1.Open(); 

De cette façon, vous pouvez réutiliser votre extension à tout moment, à tout moment, sous n'importe quelle forme, en utilisant n'importe quel contrôle DateTimePicker.

J'espère que certains d'entre vous trouveront cette astuce simple utile.

~ Joe

+1

hahaha, VooDoo était drôle – Henrique

3

Sur mon système (Windows 7, .NET 35) les autres solutions ne fonctionnent pas. J'ai trouvé une autre solution sur un site de discussion MS qui a fonctionné.

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

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

Utilisation:

dateTimePicker1.Open(); 

Avertissements. Cela ne fonctionnera pas si le dateTimePicker1 est un contrôle sur DataGridView (c'est-à-dire si vous essayez de faire un DatePicker pop-up sur le DGV). Cela fonctionne si le contrôle est ajouté au Form à la place. Ce qui se passera, c'est que l'événement "descendant" du curseur synthétisé sera avalé par la DGV, et déplacera le pointeur de cellule actuel vers le bas au lieu de déposer le Calendrier du PAO.

Questions connexes