27

我有DataGridView两列。第一列是TextBoxCol(DataGridViewTextBoxColumn),第二列是ComboBoxCol(DataGridViewComboBoxColumn)

如何更改TextBoxColwhenComboBoxCol更改其选定索引值的值?(这应该在所选索引更改时发生ComboBoxCol。而不是在离开列之后,例如dataGridView_CellValueChanged

我已经阅读了一个与我遇到的问题几乎相同的主题,但我不明白答案(根据复选标记应该是正确的)。这是链接。-几乎相同的主题

4

3 回答 3

47

这个答案在几个地方浮动。

使用 DataGridViewEditingControlShowingEventHandler 将触发比您预期更多的事件。在我的测试中,它多次触发了该事件。

同样使用 combo.SelectedIndexChanged -= 事件并不会真正删除该事件,它们只是继续堆叠。

无论如何,我找到了一个似乎可行的解决方案。我在下面包含一个代码示例:

// 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();
    }
}
于 2014-01-23T23:52:58.293 回答
33

试试这两个简单的方法(顶部方法中的 '1' 是组合框列的索引)

您要修改的行将是 setter line cel.Value =,因为您可以将其更改为您喜欢的任何内容。


    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (dataGridView1.CurrentCell.ColumnIndex == 1 && e.Control is ComboBox)
        {
            ComboBox comboBox = e.Control as ComboBox;
            comboBox.SelectedIndexChanged -= LastColumnComboSelectionChanged;
            comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged;
        }
    }

    private void LastColumnComboSelectionChanged(object sender, EventArgs e)
    {
        var currentcell = dataGridView1.CurrentCellAddress;
        var sendingCB = sender as DataGridViewComboBoxEditingControl;
        DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[0];
        cel.Value = sendingCB.EditingControlFormattedValue.ToString();
    }

在此处输入图像描述

于 2012-06-21T18:17:47.227 回答
2

该链接是正确的。处理EditingControlShowing eventDataGridView。在此事件处理程序中,检查当前列是否是您感兴趣的。然后,创建一个临时组合框对象:-

ComboBox comboBox = e.Control as ComboBox;

MSDN 有一个示例:请参阅此处的示例部分。 注意 msdn 链接中的Inheritance Hierarchy& : -Class Syntax

公共类 DataGridViewComboBoxEditingControl : ComboBox , IDataGridViewEditingControl

private DataGridView dataGridView1 = new DataGridView();

private void AddColorColumn()
{
    DataGridViewComboBoxColumn comboBoxColumn =
        new DataGridViewComboBoxColumn();
    comboBoxColumn.Items.AddRange(
        Color.Red, Color.Yellow, Color.Green, Color.Blue);
    comboBoxColumn.ValueType = typeof(Color);
    dataGridView1.Columns.Add(comboBoxColumn);
    dataGridView1.EditingControlShowing +=
        new DataGridViewEditingControlShowingEventHandler(
        dataGridView1_EditingControlShowing);
}

private void dataGridView1_EditingControlShowing(object sender,
    DataGridViewEditingControlShowingEventArgs e)
{
    ComboBox combo = e.Control as ComboBox;
    if (combo != null)
    {
        // Remove an existing event-handler, if present, to avoid 
        // adding multiple handlers when the editing control is reused.
        combo.SelectedIndexChanged -=
            new EventHandler(ComboBox_SelectedIndexChanged);

        // Add the event handler. 
        combo.SelectedIndexChanged +=
            new EventHandler(ComboBox_SelectedIndexChanged);
    }
}

private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    ((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem;
}
于 2012-06-21T16:36:47.493 回答