如何在检查单元格后停止 DataGridView 编辑?

How to Stop DataGridView editing after checked cell?

我在 DataGridView 上使用 ContexMenuStrip 来删除一些行,但它不能正常工作。

每次如果我选中 3 行,在选择 ContexMenuStrip 后它只会删除 2 行。当我在没有 ContexMenuStrip (by Button) 的情况下执行此代码时,它可以正常工作。

当我看到行为时,我明白当前行正在编辑但没有完成。双击当前行停止编辑后,我的 ContexMenuStrip 工作正常。

勾选CheckBox后如何停止编辑?

选中并编辑单元格后,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 就会更新。上面的第一行代码允许您将自己的事件处理程序 (DataGridView1_CurrentCellDirtyStateChanged) 附加到 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

中有一个小问题。它适用于鼠标点击。但是,如果您使用 Space 键切换复选框,则必须先手动切换当前单元格才能再次切换复选框。稍作改动即可使用:

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