Откройте элемент управления DateTimePicker C # программно - PullRequest
7 голосов
/ 11 марта 2010

Как программно открыть элемент управления DateTimePicker C #? Я хочу показать календарь в элементе управления Datetime Picker, отправив ключи элементу управления. Есть ли способ, которым мы можем сделать это?

Ответы [ 4 ]

7 голосов
/ 11 марта 2010

Попробуйте следующее

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

}
3 голосов
/ 10 марта 2014

В моей системе (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();

Предупреждения. Это не будет работать, если dateTimePicker1 является элементом управления на DataGridView (т. Е. Если вы попытаетесь сделать всплывающее окно DatePicker на DGV). Это работает, если вместо этого добавлен элемент управления Form. То, что произойдет, это то, что событие «вниз» синтезированного курсора будет поглощено DGV и переместит текущий указатель ячейки вниз на один вместо выпадения календаря DTP.

2 голосов
/ 10 сентября 2012

Кредит предоставляется 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.

Я надеюсь, что некоторые из вас найдут этот простой трюк полезным.

~ Джо

0 голосов
/ 14 мая 2019

Принятый ответ в основном правильный, однако вы также должны использовать:

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

После публикации события WM_LBUTTONDOWN.

Также, очевидно, WM_LBUTTONUP должно быть предварительно определено:

const Int32 WM_LBUTTONUP = 0x0202;

Итак, мой ответ:

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;
const Int32 WM_LBUTTONUP = 0x0202;

//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);
    PostMessage(dateTimePicker1.Handle, WM_LBUTTONUP, 1,lParam);
}

Это позволяет избежать ошибки Марка Лакаты в Windows 7 и / или .NET 3.5.

Причина проста: оригинальный код имитирует событие нажатия кнопки мыши, но не поднимает кнопку мыши снова, как при нажатии кнопки.

В этом отношении вы можете попробовать сами: если вы нажмете левую кнопку мыши, чтобы открыть DateTimePicker и не отпустите кнопку, вы также не сможете использовать элемент управления.

Редактировать: Адаптировать ответ jp2code:

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;
    const int WM_LBUTTONUP = 0x0202;
    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);
    PostMessage(obj.Handle, WM_LBUTTONUP, 1, lParam);
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...