什么事件在DataGridViewCell中的组合框中捕获了值的变化?

yur*_*rib 26 .net c# combobox datagridview event-handling

我希望ComboBoxDataGridView单元格中更改值时处理该事件 .

CellValueChanged事件,但是在我点击其他地方之前,那个事件才会触发DataGridView.

ComboBox SelectedValueChanged选择新值后,会立即触发一个简单的触发器.

如何将监听器添加到单元格内的组合框中?

Sev*_*run 54

上面的回答让我在报春花路上走了一段时间.它不起作用,因为它导致多个事件触发,只是不断添加事件.问题是上面捕获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 (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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Met*_*ght 14

您还可以处理在CurrentCellDirtyStateChanged更改值时调用的事件,即使它未被提交.要获取列表中的选定值,您可以执行以下操作:

var newValue = dataGridView.CurrentCell.EditedFormattedValue;
Run Code Online (Sandbox Code Playgroud)


Mit*_*nca 13

这是代码,它将触发dataGridView中comboBox中的选择事件:

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);
}
Run Code Online (Sandbox Code Playgroud)