Ячейка в режиме редактирования не запускает событие OnKeyDown в C # - PullRequest
4 голосов
/ 16 декабря 2011

Я создал собственный элемент управления сеткой данных, который вызывает событие 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);
        }
    }
}

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

Спасибо

1 Ответ

5 голосов
/ 16 декабря 2011

Вы должны вызвать событие 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);
            }

}

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

EDIT

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

...