上面的回答让我在报 Spring 花路上走了一段时间 . 它不起作用,因为它导致多个事件触发,只是不断添加事件 . 问题是上面捕获DataGridViewEditingControlShowingEvent并且它没有捕获更改的值 . 因此,每次你聚焦时都会触发,然后离开组合框,无论它是否已经改变 .
关于“CurrentCellDirtyStateChanged”的最后一个答案是正确的方法 . 我希望这可以帮助别人避免陷入兔子洞 .
这是一些代码 .
// Add the events to listen for
dataGridView1.CellValueChanged +=
new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
dataGridView1.CurrentCellDirtyStateChanged +=
new EventHandler(dataGridView1_CurrentCellDirtyStateChanged);
// This event handler manually raises the CellValueChanged event
// by calling the CommitEdit method.
void dataGridView1_CurrentCellDirtyStateChanged(object sender,
EventArgs e)
{
if (this.dataGridView1.IsCurrentCellDirty)
{
// This fires the cell value changed handler below
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
// My combobox column is the second one so I hard coded a 1, flavor to taste
DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1];
if (cb.Value != null)
{
// do stuff
dataGridView1.Invalidate();
}
}