Какое событие фиксирует изменение значения в выпадающем списке в DataGridViewCell? - PullRequest
22 голосов
/ 13 апреля 2011

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

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

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

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

Ответы [ 4 ]

47 голосов
/ 24 января 2014

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

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

var newValue = dataGridView.CurrentCell.EditedFormattedValue;
13 голосов
/ 13 апреля 2011

Это код, который будет запускать событие выделения в поле со списком в 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);
    }
0 голосов
/ 22 июня 2015
ComboBox cmbBox = (ComboBox)sender;                
MessageBox.Show(cmbBox.SelectedValue.ToString());
...