Ячейка в режиме редактирования не запускает событие OnKeyDown в C#

Я сделал собственный элемент управления datagridview, который ovveride событие OnKeyDown:

public partial class PMGrid : DataGridView
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            e.SuppressKeyPress = true; //suppress ENTER
            //SendKeys.Send("{Tab}"); //Next column (or row)
            base.OnKeyDown(e);
        }
        else if (e.KeyCode == Keys.Tab)
        {
            base.OnKeyDown(e);
            this.BeginEdit(false);
        }
        else
        {
            base.OnKeyDown(e);
        }
    }
}

Когда я щелкаю на datagridview и нажимаю Enter, он отлично работает, потому что строка не изменяется и запускается событие KeyUp. Но когда я нажимаю клавишу Tab, выбирается следующая ячейка, и она меняется на EditMode. И когда я нажимаю Enter в этой ячейке, событие KeyUp не запускается и KeyPress тоже. Я пытаюсь сделать так, чтобы пользователь мог перейти из одной ячейки в следующую, а затем пользователь может что-то записать в эту ячейку, а затем, когда пользователь нажимает Enter, это значение сохраняется в базе данных. Но когда ячейка находится в режиме редактирования, я не могу обнаружить этого пользователя, нажав Enter.

Спасибо

1 ответ

Решение

Вы должны вызвать событие KeyPress или KeyUp в событии EditingControlShowing вида сетки данных. Примерно так должно работать:

private void dtgrd1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    var txtEdit = (TextBox)e.Control;
    txtEdit.KeyPress += EditKeyPress; //where EditKeyPress is your keypress event
}


private void EditKeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true; //suppress ENTER
                //SendKeys.Send("{Tab}"); //Next column (or row)
                base.OnKeyDown(e);
            }
            else if (e.KeyCode == Keys.Tab)
            {
                base.OnKeyDown(e);
                this.BeginEdit(false);
            }
            else
            {
                base.OnKeyDown(e);
            }

}

Дайте мне знать, если у вас есть какие-либо сомнения при реализации этого кода.

РЕДАКТИРОВАТЬ

Чтобы избежать перехода к следующей строке при вводе, проверьте этот решенный вопрос: как предотвратить переход к следующей строке после редактирования DataGridViewTextBoxColumn и нажатия EnterKey?

Другие вопросы по тегам