Как остановить редактирование DataGridView после отмеченной ячейки?

Я использую ContexMenuStrip на DataGridView для удаления некоторых строк, но это работает неправильно.

Каждый раз, когда я проверял 3 строки, после выбора ContexMenuStrip он удалял только 2 строки. Когда я делаю этот код без ContexMenuStrip (по Button), он работает правильно.

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

Строка в режиме редактирования

Как прекратить редактирование после проверки CheckBox?


person saeid    schedule 20.04.2017    source источник


Ответы (2)


Когда ячейка выбрана и отредактирована, свойство DataGridView IsCurrentCellDirty устанавливается равным True. Если вы поймаете обработчик событий, когда это состояние изменится на DataGridViewCheckBoxCell, вы можете вызвать DataGridView.EndEdit(), чтобы немедленно завершить эти изменения.

this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_CurrentCellDirtyStateChanged;

private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (this.dataGridView1.IsCurrentCellDirty && this.dataGridView1.CurrentCell is DataGridViewCheckBoxCell)
    {
        this.dataGridView1.EndEdit();
    }
}

Дальнейшее объяснение:

За кулисами DataGridView.IsCurrentCellDirty обновляется всякий раз, когда вы редактируете текущую ячейку. Первая строка кода выше позволяет вам прикрепить к событию CurrentCellDirtyStateChanged собственный обработчик события (DataGridView1_CurrentCellDirtyStateChanged). Поэтому всякий раз, когда ячейка становится грязной, за кулисами будет вызываться событие базового уровня, а затем и ваш метод. Без этой строки ваш метод не будет вызываться. Оператор += — это то, что присоединяет ваш метод к цепочке вызовов события.

Например, добавив следующие обработчики:

this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_Example1;
// this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_Example2;
this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_Example3;

private void DataGridView1_Example1(object sender, EventArgs e)
{
    Console.WriteLine("Example 1");
}

private void DataGridView1_Example2(object sender, EventArgs e)
{
    Console.WriteLine("Example 2");
}

private void DataGridView1_Example3(object sender, EventArgs e)
{
    Console.WriteLine("Example 3");
}

Когда грязное состояние изменится, вы увидите следующий вывод. Обратите внимание, что второй обработчик событий был исключен:

// Example 1
// Example 3
person OhBeWise    schedule 21.04.2017
comment
Я использую ваш код, и он работает правильно. Но я не понимаю необходимости {this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_CurrentCellDirtyStateChanged;} - person saeid; 22.04.2017

В коде, предложенном OhBeWise, есть небольшая проблема. Это работает для щелчков мышью. Но если вы установите флажок с помощью клавиши «Пробел», вы не сможете снова установить флажок, не переключив сначала вручную текущую ячейку. С небольшим изменением это будет работать:

private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (this.dataGridView1.IsCurrentCellDirty && this.dataGridView1.CurrentCell is DataGridViewCheckBoxCell)
    {
        this.dataGridView1.EndEdit();

        DataGridViewCell currentCell = this.dataGridView1.CurrentCell;

        this.dataGridView1.CurrentCell = null;
        this.dataGridView1.CurrentCell = currentCell;
    }
}
person ZuBsPaCe    schedule 20.08.2019