如何在检查单元格后停止 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;
}
}
我在 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
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;
}
}