在DataGridViewComboBoxColumn SelectedIndexChanged期间触发的事件

我有两列DataGridView 。 第一列是TextBoxCol(DataGridViewTextBoxColumn) ,第二列是ComboBoxCol(DataGridViewComboBoxColumn)

ComboBoxCol更改其选定的索引值时,如何更改TextBoxCol值? (这应该在ComboBoxCol更改选定的索引时发生。不在离开列之后,如dataGridView_CellValueChanged

我已经阅读了一个与我遇到的几乎相同的问题,但我不明白答案(根据复选标记应该是正确的)。 这是链接。 – 几乎相同的主题

给出这两个简单的方法(top方法中的’1’是combobox列的索引)

您将修改的行将是setter行cel.Value = ,因为您可以将其更改为您喜欢的任何内容。


  private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (dataGridView1.CurrentCell.ColumnIndex == 1 && e.Control is ComboBox) { ComboBox comboBox = e.Control as ComboBox; comboBox.SelectedIndexChanged -= LastColumnComboSelectionChanged; comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged; } } private void LastColumnComboSelectionChanged(object sender, EventArgs e) { var currentcell = dataGridView1.CurrentCellAddress; var sendingCB = sender as DataGridViewComboBoxEditingControl; DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[0]; cel.Value = sendingCB.EditingControlFormattedValue.ToString(); } 

在此处输入图像描述

这个答案在几个地方浮动。 使用DataGridViewEditingControlShowingEventHandler将触发比您想要的更多事件。 在我的测试中,它多次触发了该事件。 另外使用combo.SelectedIndexChanged – =事件不会真正删除事件,它们只是保持堆叠。 无论如何,我找到了似乎有效的解决方案。 我在下面包含一个代码示例:

  // 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 (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(); } } 

那个链接是正确的。 处理DataGridView的EditingControlShowing event 。 在此事件处理程序中,检查当前列是否符合您的兴趣。 然后,创建一个临时combobox对象: –

ComboBox comboBox = e.Control as ComboBox;

MSDN有一个示例:请参见此处的示例部分。 请注意 msdn链接中 Inheritance HierarchyClass Syntax : –

公共类DataGridViewComboBoxEditingControl: ComboBox ,IDataGridViewEditingControl

 private DataGridView dataGridView1 = new DataGridView(); private void AddColorColumn() { DataGridViewComboBoxColumn comboBoxColumn = new DataGridViewComboBoxColumn(); comboBoxColumn.Items.AddRange( Color.Red, Color.Yellow, Color.Green, Color.Blue); comboBoxColumn.ValueType = typeof(Color); dataGridView1.Columns.Add(comboBoxColumn); dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler( dataGridView1_EditingControlShowing); } private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { ComboBox combo = e.Control as ComboBox; if (combo != null) { // Remove an existing event-handler, if present, to avoid // adding multiple handlers when the editing control is reused. combo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged); // Add the event handler. combo.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged); } } private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) { ((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem; }