valor una selectionchangecommitted seleccionar item evento cellvaluechanged celda cambiar c# .net datagridview combobox event-handling

c# - una - ¿Qué evento detecta un cambio de valor en un cuadro combinado en un DataGridViewCell?



evento al seleccionar un item en un combobox c# (4)

Quiero controlar el evento cuando se cambia un valor en un ComboBox en una celda DataGridView .

CellValueChanged evento CellValueChanged , pero ese no se dispara hasta que hago clic en otro lugar dentro de DataGridView .

Un simple ComboBox SelectedValueChanged se dispara inmediatamente después de seleccionar un nuevo valor.

¿Cómo puedo agregar un oyente al cuadro combinado que está dentro de la celda?


Este es el código, que activará el evento de la selección en el comboBox en el dataGridView:

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


La respuesta anterior me llevó por el camino de la primavera por un tiempo. No funciona, ya que hace que se activen varios eventos y simplemente continúa agregando eventos. El problema es que lo anterior atrapa el DataGridViewEditingControlShowingEvent y no captura el valor cambiado. Así que se activará cada vez que te concentres y luego dejas el cuadro combinado si ha cambiado o no.

La última respuesta sobre "CurrentCellDirtyStateChanged" es la forma correcta de hacerlo. Espero que esto ayude a alguien a evitar caer por un agujero de conejo.

Aquí hay un código.

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


También puede manejar el evento CurrentCellDirtyStateChanged que se llama cuando se cambia un valor, incluso si no está comprometido. Para obtener el valor seleccionado en la lista, debería hacer algo como:

var newValue = dataGridView.CurrentCell.EditedFormattedValue;


ComboBox cmbBox = (ComboBox)sender; MessageBox.Show(cmbBox.SelectedValue.ToString());