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

时间:2017-04-20 21:32:42

标签: c# checkbox datagridview contextmenustrip

我在ContexMenuStrip上使用DataGridView删除了一些行,但它无法正常工作。

每次如果我检查了3行,选择ContexMenuStrip后它只会删除2行。当我执行此代码而没有正常工作的ContexMenuStripButton)时。

当我看到行为时,我理解当前行正在编辑但未完成。双击当前行以停止编辑后,ContexMenuStrip正常工作。

Row in edit mode

检查CheckBox后如何停止编辑?

2 个答案:

答案 0 :(得分:1)

选择并修改单元格后,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

答案 1 :(得分:0)

code proposed by 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;
    }
}