Подтвердить что ты не робот

Событие Keydown DataGridView не работает в С#

Событие keydown DataGridView не работает, когда я редактирую текст внутри ячейки.

Я назначаю ярлык Alt + S для сохранения данных, он работает, когда ячейка не находится в режиме редактирования, но если она находится в режиме редактирования ниже кода не работает

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
 {
    if (e.KeyData == (Keys.Alt | Keys.S))
    {
         //save data
    }
 }
4b9b3361

Ответ 1

Всякий раз, когда ячейка находится в режиме редактирования, ее размещенный элемент управления получает событие KeyDown вместо родительского DataGridView, который содержит его.. Поэтому ваша комбинация клавиш работает всякий раз, когда ячейка не в режиме редактирования (даже если он выбран), потому что сам элемент управления DataGridView получает событие KeyDown. Однако, когда вы находитесь в режиме редактирования, элемент управления редактирования, содержащийся в ячейке, принимает событие, и ничего не происходит, потому что к нему не привязана ваша пользовательская процедура обработчика.

Я потратил слишком много времени на настройку стандартного элемента управления DataGridView, чтобы обрабатывать редактирование, как я его хочу, и я обнаружил, что самый простой способ обойти это явление - подклассифицировать существующий DataGridView контроль и переопределение функции ProcessCmdKey. Независимо от того, какой пользовательский код вы ввели здесь, будет выполняться всякий раз, когда клавиша нажата поверх DataGridView, независимо от того, находится ли она в режиме редактирования.

Например, вы можете сделать что-то вроде этого:

class MyDataGridView : System.Windows.Forms.DataGridView
{
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {

        MessageBox.Show("Key Press Detected");

        if ((keyData == (Keys.Alt | Keys.S)))
        {
            //Save data
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

Также см. связанную, хотя и несколько более старую статью: Как уловить нажатия клавиш в элементах управления с помощью Visual С#

Ответ 2

Другой способ сделать это - использовать событие EditingControlShowing для перенаправления обработки событий на специальный обработчик событий, как показано ниже:

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
 {
    if (e.Control is DataGridViewTextBoxEditingControl tb)
            {
                tb.KeyDown -= dataGridView1_KeyDown;
                tb.KeyDown += dataGridView1_KeyDown;
            }
 }

//then in your keydown event handler, execute your code
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
 {
    if (e.KeyData == (Keys.Alt | Keys.S))
    {
         //save data
    }
 }

Ответ 3

Простейший способ, который я только что опробовал, заключается в следующем:

  • Задайте для свойства KeyPreview форму true.
  • Вместо того, чтобы ловить событие KeyDown в Grid, поймайте событие KeyDown в форме.

Введите код следующим образом:

Private Sub form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown

   If grd.Focused Then

      'Do your work

   End If

End Sub

Ответ 4

Это верно, что EditingControlShowing может помочь, но не если вы хотите поймать клавишу Enter. В этом случае следует использовать следующий метод:

 private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is DataGridViewTextBoxEditingControl)
        {
            DataGridViewTextBoxEditingControl tb = e.Control as DataGridViewTextBoxEditingControl;
            tb.KeyDown -= dataGridView_KeyDown;
            tb.PreviewKeyDown -= dataGridView_PreviewKeyDown;
            tb.KeyDown += dataGridView_KeyDown;
            tb.PreviewKeyDown += dataGridView_PreviewKeyDown;
        }
    }

    void dataGridView_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            <your logic goes here>
        }
    }

Ответ 5

использовать PreviewKeyDown событие

private void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{

}