Question: I use `ContexMenuStrip` on `DataGridView` to delete some rows but it doesn't work correctly.

Every time if I checked 3 rows, after selecting the `ContexMenuStrip` it only deletes 2 rows. When I do this code without the `ContexMenuStrip` (by `Button`) that works correctly.

When I see the behavior I understand current row is editing but doesn't finish. After double clicking on the current row to stop editing my `ContexMenuStrip` works correctly.

[![Row in edit mode](https://i.stack.imgur.com/z2eFg.jpg)](https://i.stack.imgur.com/z2eFg.jpg)

How to stop editing after checking the `CheckBox`?

Answer: 
When a cell has been selected and edited, the `DataGridView` property `IsCurrentCellDirty` is set to `True`. If you catch the event handler when this state changes on a `DataGridViewCheckBoxCell`, you can call [`DataGridView.EndEdit()`](https://msdn.microsoft.com/en-us/library/ms158620(v=vs.110).aspx) to finalize those changes immediately.

```
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();
    }
}

```

---

Further explanation:

Behind the scenes, [`DataGridView.IsCurrentCellDirty`](https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.iscurrentcelldirty(v=vs.110).aspx) is updated whenever you edit the current cell. The first line of code above allows you to attach to the `CurrentCellDirtyStateChanged` event your own event handler (`DataGridView1_CurrentCellDirtyStateChanged`) . So whenever the cell becomes dirty, behind the scenes will call the base level event and then your method as well. Without that line, your method will not be called. The `+=` operator is what *attaches* your method to the event's call-chain.

For example, adding the following handlers:

```
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");
}

```

When the dirty state changes, you'll see the following output. Notice the 2nd event handler was excluded:

```
// Example 1
// Example 3

```
There's a small problem in the [code proposed by OhBeWise](https://stackoverflow.com/a/43542992/998987). It works for Mouse-Clicks. But if you toggle the checkbox with the Space key you can't toggle the checkbox again without manually switching the current cell first. With a small change it will work:

```
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;
    }
}

```