Как я могу захватить нажатие клавиши, которая вызывает «CellEndEdit» на DataGridView в C #? - PullRequest
5 голосов
/ 22 апреля 2009

У меня есть DataGridView, который установлен на EditOnF2. Я делаю некоторую специальную обработку данных в обработчике событий CellEndEdit, который устанавливает значение ячейки. Я все еще хочу, чтобы функциональность EditOnKeystrokeOrF2 возвращалась к исходному значению при нажатии клавиши Esc. К сожалению, в обработчике событий CellEndEdit я не вижу способа сказать, что вызвало событие CellEndEdit. Я только хочу изменить значение ячейки, если клавиша Esc не нажата. Как я могу сказать, если это было или нет?

Редактировать: Стоит отметить, что событие KeyDown не запускается ни при редактировании ячейки, ни при окончательном нажатии клавиши.

Edit2: я попробовал предложение KeyPreview, но форма все еще не фиксирует нажатие клавиши Escape.

Edit3: я экспериментировал с попытками заставить это работать. Первоначально я опубликовал некоторые из следующих статей в качестве отдельного сообщения, но, возможно, было бы более уместно включить их сюда.

У меня есть ячейка в DataGridView, которая теперь имеет значение EditProgrammatics. Чтобы зафиксировать нажатие клавиши, которая начинает редактирование, я устанавливаю ячейку. Значение равно нажатию клавиши. Однако это разрушает функциональность "Escape" ячейки - когда вы нажимаете escape, вместо возврата к исходному значению, он возвращается к нажатию клавиши, которое я программно вставил в ячейку.

Я полагаю, что если бы я мог установить «EditedFormattedValue» для ячейки, это было бы то место, где я хотел бы поместить свое значение нажатия клавиши, однако это, кажется, только для чтения. Как я могу выполнить то, что я пытаюсь?

Пример для пояснения: если ячейка имеет значение «54,3», и я нажимаю клавишу «9», она начинает редактирование ячейки и помещает туда «9». Если я нажму Escape, вместо того, чтобы вернуться к «54.3», он вернется к «9». Я хочу, чтобы он вернулся к своему первоначальному значению "54,3".

Итак, я пытаюсь решить эту проблему с самого начала и до конца. Я думаю, что реальная проблема заключается в том, что я перезаписываю исходное значение и не могу определить, следует ли мне его вернуть или нет.

Edit4: похоже, что CellValidating может стоить использовать, но я вижу странное поведение, когда экспериментирую с ним. В новом проекте я создаю DataGridView и регистрируюсь для различных событий и вижу, что CellValidating запускается до CellEndEdit. Однако, в моем проекте, где я пытаюсь заставить это работать, CellEndEdit запускает ДО CellValidating. Любые идеи о том, в чем может быть разница?

Ответы [ 3 ]

2 голосов
/ 22 апреля 2009

Установите для свойства KeyPrevew в форме значение true; это будет препятствовать тому, чтобы контроль сожрал это сначала. :)

0 голосов
/ 18 января 2012

Моя проблема была похожа, вот мой обходной путь:

Problem: Когда пользователь начал редактировать значение ячейки в DGV и нажимал клавишу ESC перед фиксацией значения, вызывался EndEdit, который переписывал все поля DGV в базу данных, таким образом обновляя поля даты и времени обновления, я хотел только DGV .EndEdit для запуска, когда пользователь фактически изменил значение и не нажимал ESC при этом.

Solution: В проверке ячейки я использовал флаг типа this , чтобы проверить, изменилось ли значение, и если значение флага ложно, просто выполните if(!flag)return; в EndEdit

0 голосов
/ 10 июня 2010

Во-первых, вы абсолютно правы, KeyPreview не сработает. Сначала я подумал, что смогу обойти это, переопределив IsInputKey метода формы. Эта техника работала для меня в некоторых других случаях, когда я не мог поймать ключ, который мне нужно было поймать. Это тоже не сработало, поэтому я попытался создать подкласс DataGridView и переопределить IsInputKey там. Это тоже не сработало. После некоторого изучения других методов, которые я мог переопределить, я узнал, что существует другой класс ключей, называемый командными ключами, которые мне нужно перехватить. Чтобы сделать это, переопределите ProcessCmdKey на вашем DataGridView (вам понадобится его подкласс).

Вот мой код:

public class CommandKeyInterceptingDataGridView : DataGridView
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        Debug.WriteLine(keyData);
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

И вывод из режима редактирования с помощью F2, изменения ячейки с надписью «Hello» и отмены редактирования с помощью Escape.

F2
ShiftKey, Shift
H, Shift
E
L
L
O
Escape

Надеюсь, это даст вам то, что вам нужно.

...