C # Отправить нажатие клавиши в DataGridViewCell - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть ячейка DateTimePicker в моем DataGridView.Я хотел бы иметь возможность войти в режим редактирования и сбросить календарь при нажатии кнопки.Я могу сделать первую часть без затруднений, но вторая не работает.Если у меня есть автономный DateTimePicker, вызов SendKeys работает должным образом.

//Select the cell and enter edit mode -  works
myDGV.CurrentCell = myDGV[calColumn.Index, e.RowIndex];
myDGV.BeginEdit(true);

//Send an ALt-Down keystroke to drop the calendar  - doesn't work
SendKeys.SendWait("%{DOWN}");

Из отладки я считаю, что проблема в том, что нажатие клавиши отправляется в DGV, а не в конкретную ячейку, которую я пытаюсь отредактировать.Причина, по-моему, заключается в том, что я поместил код в журнал ключей, полученных событиями сетки KeyPress и KeyDown.Они регистрируют мою стрелку вокруг сетки и ключи, отправленные SendKeys, но не те, которые были при редактировании ячейки, набрав ее.

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Пожалуйста, смотрите мой ответ на C # Winforms DataGridView Time Column . Я верю, что это будет соответствовать вашим потребностям идеально. Вы также можете использовать его для столбца с ComboBox.

0 голосов
/ 02 ноября 2012

Я недавно вновь обратился к этой проблеме, потому что реализация, предоставленная 0A0D, не всегда хорошо сочеталась с навигацией клавиатуры по сетке (стрелки / табуляция). Время от времени можно было обойти DateTimePicker и ввести текст в DataGridViewTextBoxCell. Это привело к тому, что моя логика проверки вышла из-под контроля; и после того, как я не смог найти способ предотвратить возникновение промахов, я решил попытаться снова заставить работать пользовательский столбец.

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

/// <summary>
/// Extended DateTimePicker with a method to programmatically display the calendar.
/// </summary>
class DateTimePickerEx : DateTimePicker
{
    [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;

    /// <summary>
    /// Displays the calendar input control.
    /// </summary>
    public void ShowCalendar()
    {
        Int32 x = Width - 10;
        Int32 y = Height / 2;
        Int32 lParam = x + y * 0x00010000;

        PostMessage(Handle, WM_LBUTTONDOWN, 1, lParam);
    }
}

Затем я изменил пример столбца MSDN DateTime , чтобы CalendarEditingControl наследовал от DateTimePickerEx.

Затем в форме размещения DataGridView я использовал свойство EditingControl для вызова метода ShowCalendar().

DateTimePickerEx dtp = myDataGridView.EditingControl as DateTimePickerEx;
if (dtp != null)
    dtp.ShowCalendar();
...