События DataGridView - PullRequest
       21

События DataGridView

4 голосов
/ 09 января 2012

Мне нужно выполнить задачу всякий раз, когда пользователь обычно завершает режим редактирования (независимо от того, действительно ли пользователь изменил значение или нет; но не тогда, когда пользователь отменяет режим редактирования, нажав ESC) в столбце TextBox DataGridView управление.

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

DataGridView.CellValidating и DataGridView.CellValidated:

Эти события запускаются всякий раз, когда пользователь выбирает другую ячейку, даже если ячейка не была в режиме редактирования. Я попытался проверить свойство IsCurrentCellDirty внутри события CellValidating. Это почти то, что мне нужно, но IsCurrentCellDirty устанавливается только тогда, когда пользователь фактически изменяет значение. Но мне также нужно выполнить задачу, когда пользователь обычно завершает режим редактирования, ничего не меняя. Эти события не запускаются, когда пользователь отменяет режим редактирования, что хорошо.

DataGridView.CellValueChanged

Это событие также вызывается слишком часто (оно также запускается, когда значение ячейки устанавливается программно).

DataGridView.CellEndEdit

Это событие почти то, что я хочу. Но он также срабатывает, когда пользователь отменяет режим редактирования нажатием ESC. Есть ли способ проверить, был ли отменен режим редактирования внутри события CellEndEdit?

DataGridView.CellParsing

Это событие почти то, что я хочу. Но он не срабатывает, когда пользователь завершает режим редактирования, ничего не изменив.

Validating и Validated события управления редактированием

Я зарегистрировался на эти события внутри события DataGridView.EditingControlShowing. Они делают почти то, что я хочу, но они также запускаются, когда пользователь отменяет режим редактирования нажатием ESC. Есть ли способ проверить, был ли режим редактирования отменен внутри этих событий?

Любые другие предложения о событиях, на которые я мог бы зарегистрироваться, и / или флаги, которые я мог бы проверить, чтобы достичь желаемого поведения?

Ответы [ 2 ]

4 голосов
/ 09 января 2012

Что вы можете сделать, это зарегистрироваться на событие PreviewKeyDown для EditingControl внутри события EditingControlShowing для DataGridView.Оттуда можно определить, была ли нажата кнопка escape в элементе управления редактированием, и установить флаг, который будет считан событием CellEndEdit.

Вы можете вывести необходимые события для регистрации из имен методов.Это предполагает, что в вашем классе есть поле bool с именем escapePressed, что (что неудивительно) является флагом для нажатия клавиши escape.

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    e.Control.PreviewKeyDown -= Control_PreviewKeyDown; //avoid attaching multiple handlers in case control is cached
    e.Control.PreviewKeyDown += new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
}

void Control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Escape)
    {
        Console.WriteLine("escape pressed");
        escapePressed = true;
    }
}

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (!escapePressed)
    {
        Console.WriteLine("do your stuff"); //escape was not pressed.
    }
    else escapePressed = false; //reset the flag
}
1 голос
/ 09 января 2012

Вот мой обходной путь:

Введите

private DataGridViewCell cellBeingEdited = null;

В DataGridView.EditingControlShowing

cellBeingEdited = DataGridView.CurrentCell;

В DataGridView.CellEndEdit

cellBeingEdited = null;

Тогда я могу использовать событие DataGridView.CellValidating, которое не срабатывает при отмене редактирования, и проверить мое поле cellBeingEdited:

if (DataGridView.CurrentCell != cellBeingEdited) return;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...