C # datetime picker -> использовать обновление и выбор - PullRequest
1 голос
/ 27 ноября 2011

У меня есть средство выбора даты и времени, и я хочу использовать обновление и стрелку для выбора даты (раскрывающийся календарь) или, если щелкнуть правой кнопкой мыши средство выбора даты и времени, отобразится средство выбора даты (раскрывающийся календарь).Как я могу это сделать?

Ответы [ 4 ]

2 голосов
/ 27 ноября 2011

Встроенный элемент управления Windows, который реализует DateTimePicker, имеет очень мало наворотов.Есть сообщение, которое вы можете отправить, чтобы принудительно закрыть раскрывающийся календарь, но нет ни одного, чтобы заставить его открыться.Это требует, чтобы получить сырой, раскрывающийся список может быть открыт с помощью нажатия клавиш Alt + Down.Что делает этот обработчик события MouseUp работающим:

    private void dateTimePicker1_MouseUp(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Right) SendKeys.Send("%{down}");
    }

Это надежно, фокус в этом случае всегда хорош.

1 голос
/ 27 ноября 2011

В очень общем смысле вы говорите о привязке к событиям. В этом случае вас интересует привязка к событиям клавиатуры и мыши.

Итак, посмотрите справочный материал о событиях нажатия клавиш, нажатия клавиш и событиях нажатия.

В событиях нажатия клавиш вы можете отфильтровать по типу клавиши или комбинации клавиш, которые вас интересуют, с помощью клавиш вверх / вниз.

В обработчике события click вы можете проверить, какая кнопка мыши удерживается нажатой (влево и вправо и т. Д.).

После того, как вы захватили и отфильтровали интересующее вас событие, вы можете просто активировать раскрывающееся меню выбора даты и времени. Чтобы отобразить календарь, вы можете вызвать InvokeOnClick на datetimepicker.

РЕДАКТИРОВАТЬ: я предполагаю, что вы подкласса управления.

1 голос
/ 27 ноября 2011

Вы должны отправить сообщение Windows кнопке или элементу управления, оно не отображается элементом управления.

В этой статье есть хороший пример симуляции нажатия на кнопку.

0 голосов
/ 27 ноября 2011

Есть способ сделать это, но это что-то вроде хака (мне бы это не очень понравилось).Как уже указывалось, вы можете открыть календарь, используя SendMessage, но это не работает, если ShowUpDown истинно (я понимаю, что у вас есть).

Итак, щелкните правой кнопкой мышиВам нужно сначала установить для ShowUpDown значение false, а затем отобразить календарь.Чтобы снова показать вверх-вниз, установите ShowUpDown в значение true в ValueChanged и событие Leave средства выбора даты и времени.

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

private const uint WM_SYSKEYDOWN = 0x104;

void dateTimePicker1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        this.dateTimePicker1.ShowUpDown = false;
        SendMessage(dateTimePicker1.Handle, WM_SYSKEYDOWN, (int)Keys.Down, 0);
    }
    else
    {
        this.dateTimePicker1.ShowUpDown = true;
    }
}

// Connect this to ValueChanged and Leave events.
private void resetDateTimePickerShowUpDown(object sender, EventArgs e)
{
    this.dateTimePicker1.ShowUpDown = true;
}
...