如何在选中单元格后停止DataGridView的编辑?

3
我在 DataGridView 上使用 ContexMenuStrip 删除一些行,但它不能正确工作。
每次我勾选 3 行后,在选择 ContexMenuStrip 后,它只能删除 2 行。如果我不用 ContexMenuStrip(通过 Button),那么就可以正常工作。
当我看到这种行为时,我理解当前行正在编辑但未完成。双击当前行停止编辑后,我的 ContexMenuStrip 就可以正常工作了。

Row in edit mode

如何在勾选复选框后停止编辑?
2个回答

4

当一个单元格被选择并编辑后,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

我使用了你的代码,它可以正常工作。但是我不理解为什么需要 {this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_CurrentCellDirtyStateChanged;}。 - saeid

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接