使用DataGridView Combobox的SelectionChangeCommitted Event获取新值或索引

时间:2011-11-11 07:22:37

标签: c# datagridview selectedindexchanged datagridviewcombobox

我使用SelectionChangeCommitted在组合框选择的索引发生变化时捕获事件,但我无法获得它的新值或索引。

private void ruleList_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is ComboBox)
        {
            ComboBox comboBox = e.Control as ComboBox;
            comboBox.SelectionChangeCommitted += ruleListColumnComboSelectionChanged;
        }
    }

    private void ruleListColumnComboSelectionChanged(object sender, EventArgs e)
    {
        string value = ruleList.CurrentCell.Value.ToString(); // just return the old value before the change
    }

4 个答案:

答案 0 :(得分:1)

您可以尝试使用CommitEdit关键字(CommitEdit,MSDN页面上也有一个示例)。将其添加到您的DataGridView

// This event handler manually raises the CellValueChanged event
// by calling the CommitEdit method.
void dataGridView1_CurrentCellDirtyStateChanged(object sender,
    EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

然后您可以只听取CellValueChanged并避免尝试在底层编辑控件上注册ComboBoxValueChanged事件。

答案 1 :(得分:1)

您可以使用以下方式获取新值:

ComboBox comboBox = sender.Control as ComboBox;
MessageBox.Show(comboBox.Text);

答案 2 :(得分:0)

如果我理解得很好,你就会对组合框中的SelectionChangeCommitted事件作出反应,但试图通过网格获取值。这是对的吗?

  • ruleList中的承诺是如何完成的?
  • 承诺是否已经在那个时间点发生了?

我的感觉是,通过此SelectionChangeCommitted事件,您可以直接访问组合框中的值,但尚未通过网格访问,因为它尚未提交。

答案 3 :(得分:0)

改进Killercam的方法,你可以检查currentcell是一个datagridviewcomboboxcell并做(在VB中你可以很容易地转换为C#)

If TypeOf CType(sender, DataGridView).CurrentCell Is DataGridViewComboBoxCell Then
    CType(sender, DataGridView).CommitEdit(DataGridViewDataErrorContexts.Commit)
    CType(sender, DataGridView).EndEdit()
End If

我还为完整性添加了 EndEdit()方法。