Всякий раз, когда ячейка находится в режиме редактирования, ее размещенный элемент управления получает событие 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 C #