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();
}