Подтвердить что ты не робот

Какое событие вызывает изменение ценности в combobox в DataGridViewCell?

Я хочу обработать событие, когда значение изменяется в ComboBox в ячейке DataGridView.

Здесь событие CellValueChanged, но оно не срабатывает, пока я не щелкнул где-то еще внутри DataGridView.

Простой ComboBox SelectedValueChanged срабатывает сразу после выбора нового значения.

Как добавить слушателя в поле со списком внутри ячейки?

4b9b3361

Ответ 1

Вышеприведенный ответ привел меня по дороге первоцвета на некоторое время. Он не работает, поскольку он вызывает несколько событий, и он просто добавляет события. Проблема заключается в том, что вышеперечисленное захватывает 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();
        }
     }

Ответ 2

Это код, который активирует событие выбора в comboBox в 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);
    }

Ответ 3

Вы также можете обрабатывать событие CurrentCellDirtyStateChanged, которое вызывается при изменении значения, даже если оно не выполняется. Чтобы получить выбранное значение в списке, вы должны сделать что-то вроде:

var newValue = dataGridView.CurrentCell.EditedFormattedValue;

Ответ 4

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