c# .net winforms datagridview datagridviewcomboboxcell

c# - Evento que se dispara durante DataGridViewComboBoxColumn SelectedIndexChanged



.net winforms (3)

Tengo DataGridView con dos columnas. La primera columna es TextBoxCol(DataGridViewTextBoxColumn) y la segunda es ComboBoxCol(DataGridViewComboBoxColumn) .

¿Cómo puedo cambiar el valor de TextBoxCol cuando ComboBoxCol cambia su valor de índice seleccionado? (Esto debe suceder cuando el índice seleccionado cambia en ComboBoxCol . No después de abandonar la columna, como dataGridView_CellValueChanged )

He leído un tema con casi el mismo problema que tengo pero no entiendo la respuesta (que debería ser la base correcta en la marca de verificación). Aquí está el enlace. -Casi el mismo tema


Ese enlace es correcto. Maneje el EditingControlShowing event de DataGridView. En este controlador de eventos, compruebe si la columna actual es de su interés. Y, a continuación, crear un objeto temporal de combobox: -

ComboBox comboBox = e.Control as ComboBox;

MSDN tiene una muestra: vea en la sección de ejemplos here . Tenga en cuenta la Class Syntax Inheritance Hierarchy y Class Syntax Inheritance Hierarchy en el enlace msdn: -

clase pública 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; }


Esta respuesta está flotando en un par de lugares. El uso de DataGridViewEditingControlShowingEventHandler activará más eventos de los que desea. En mi prueba disparó el evento varias veces. También utilizando el evento combo.SelectedIndexChanged - = no eliminará realmente el evento, solo seguirán apilando. De todos modos, encontré una solución que parece funcionar. Incluyo un ejemplo de código a continuación:

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


Pruebe estos dos métodos simples (el ''1'' en el método superior es el índice de la columna de cuadro combinado)

La línea a la que le haría modificaciones sería la línea de establecimiento cel.Value = , ya que puede cambiarla a lo que desee.

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