什么事件在DataGridViewCell中的combobox中捕获了值的变化?

我想在DataGridView单元格中的ComboBox中更改值时处理该事件。

CellValueChanged事件,但是在我点击DataGridView其他地方之前,该事件才会触发。

SelectedValueChanged新值后,会立即触发一个简单的ComboBox SelectedValueChanged

如何将监听器添加到单元格内的combobox中?

上面的回答让我在报春花路上走了一段时间。 它不起作用,因为它会导致多个事件触发,并且只是不断添加事件。 问题是上面捕获DataGridViewEditingControlShowingEvent并且它没有捕获更改的值。 因此,每次聚焦时它都会触发,然后离开combobox,无论它是否已经改变。

关于“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(); } } 

您还可以处理CurrentCellDirtyStateChanged事件,只要值发生更改,就会调用该事件,即使它未被提交。 要获取列表中的选定值,您可以执行以下操作:

 var newValue = dataGridView.CurrentCell.EditedFormattedValue; 

这是代码,它将触发dataGridView中comboBox中的选择事件:

 public Form1() { InitializeComponent(); DataGridViewComboBoxColumn cmbcolumn = new DataGridViewComboBoxColumn(); cmbcolumn.Name = "cmbColumn"; cmbcolumn.HeaderText = "combobox column"; cmbcolumn.Items.AddRange(new string[] { "aa", "ac", "aacc" }); dataGridView1.Columns.Add(cmbcolumn); dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing); } private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { ComboBox combo = e.Control as ComboBox; if (combo != null) { combo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged); combo.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged); } } private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cb = (ComboBox)sender; string item = cb.Text; if (item != null) MessageBox.Show(item); } 
 ComboBox cmbBox = (ComboBox)sender; MessageBox.Show(cmbBox.SelectedValue.ToString());