C# DataGridViewComboxColumn SelectedIndexChanged期间激发的事件

C# DataGridViewComboxColumn SelectedIndexChanged期间激发的事件,c#,.net,winforms,datagridview,datagridviewcomboboxcell,C#,.net,Winforms,Datagridview,Datagridviewcomboboxcell,我有两列的DataGridView。第一列是TextBoxCol(DataGridViewTextBoxColumn),第二列是ComboxCol(DataGridViewComboxColumn) 当comboxcol更改其所选索引值时,如何更改TextBoxCol的值? (当所选索引在ComboBoxCol中更改时,应该发生这种情况。而不是在离开该列之后,如dataGridView\u CellValueChanged) 我读过一个题目,题目和我的问题差不多,但我不明白答案(根据复选标记,答

我有两列的
DataGridView
。第一列是
TextBoxCol(DataGridViewTextBoxColumn)
,第二列是
ComboxCol(DataGridViewComboxColumn)

comboxcol
更改其所选索引值时,如何更改
TextBoxCol
的值? (当所选索引在
ComboBoxCol
中更改时,应该发生这种情况。而不是在离开该列之后,如
dataGridView\u CellValueChanged


我读过一个题目,题目和我的问题差不多,但我不明白答案(根据复选标记,答案应该是正确的)。这是链接

这个链接是正确的。处理DataGridView的编辑控件显示事件。在此事件处理程序中,检查当前列是否符合您的兴趣。然后,创建一个临时组合框对象:-

ComboBox ComboBox=e.控件作为ComboBox

MSDN有一个示例:请参见示例部分中的。 注意msdn链接中的继承层次结构
&
类语法
:-

公共类DataGridViewComboBox编辑控件:ComboBox, IDataGridViewEditingControl


尝试这两个简单方法(顶部方法中的“1”是combobox列的索引)

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




这个答案在几个地方都有

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

另外,使用combo.SelectedIndexChanged-=事件不会真正删除事件,它们只是保持堆叠

无论如何,我找到了一个似乎有效的解决方案。我在下面提供了一个代码示例:

//添加要侦听的事件
dataGridView1.CellValueChanged+=新的DataGridViewCellEventHandler(dataGridView1\u CellValueChanged);
dataGridView1.CurrentCellDirtyStateChanged+=新事件处理程序(dataGridView1\U CurrentCellDirtyStateChanged);
//此事件处理程序手动引发CellValueChanged事件
//通过调用committedit方法。
void dataGridView1\u CurrentCellDirtyStateChanged(对象发送方,事件参数e)
{
if(dataGridView1.IsCurrentCellDirty)
{
//这将触发下面的单元格值更改处理程序
dataGridView1.CommittedIt(DataGridViewDataErrorContexts.Commit);
}
}
私有void dataGridView1\u CellValueChanged(对象发送方,DataGridViewCellEventArgs e)
{
//我的combobox列是第二列,所以我硬编码了一个1,口味
DataGridViewComboxCell cb=(DataGridViewComboxCell)dataGridView1.Rows[e.RowIndex].Cells[1];
如果(cb.Value!=null)
{
//做事
dataGridView1.Invalidate();
}
}

很高兴能为您提供帮助,我将继续关注您的问题,因为我已经打开了项目:)。请确保您还使用
comboBox.SelectedIndexChanged-=LastColumnComboSelectionChanged删除了任何现有的事件处理程序这确实比公认的解决方案好。唯一需要更改的是添加if(e.RowIndex=-1)返回;对于dataGridView1\u CellValueChanged函数的开头,这绝对是一个更好的解决方案,所选的函数会多次触发事件。答案很好,imho应该是被接受的!!只需添加一件事:在
CellValueChanged
处理程序中,您可能希望检查更改了哪些列/单元格,而不是通常的“做事情”;-)例如,
if(E.ColumnIndex==dataGridView1.Columns[“Column2”].Index).
在提交CurrentCellDirtyStateChanged事件处理程序中的更改后,必须调用DataGridView.BeginEdit(),以将“焦点”放回EditingControl(组合框)上并真正使其行为类似于组合框的SelectedIndexChanged事件。默认情况下,voodoo.NET编码器应该包括这类事件。不应该期望用户能够理解它。
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;
}
    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();
    }