当组合框中的选择更改时,DataGridView中的提交已更改
问题描述:
编辑单元格中的ComboBox
编辑控件更改其选择后,如何强制引发DataGridView.CellValueChanged
事件(并将其更改为DataGridViewCell.Value
属性)?默认情况下,该事件仅在具有ComboBox的单元失去焦点后才会引发。当组合框中的选择更改时,DataGridView中的提交已更改
答
我解决了它这样做:
myDataGridView.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(myDataGridView_EditingControlShowing);
private void myDataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
{
ComboBox cmb = (ComboBox)e.Control;
cmb.SelectionChangeCommitted -= new EventHandler(cmb_SelectionChangeCommitted);
cmb.SelectionChangeCommitted += new EventHandler(cmb_SelectionChangeCommitted);
}
}
void cmb_SelectionChangeCommitted(object sender, EventArgs e)
{
dgvPresupuesto.CurrentCell.Value = ((DataGridViewComboBoxEditingControl)sender).EditingControlFormattedValue;
}
答
组合框的值的变化实际上是与网格关联的编辑控件。 因此,要启动什么,你将不得不添加这些在DataGrid的EditingControlShowing事件为特定列
private void dg_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dg.CurrentCell.ColumnIndex == 0)
{
ComboBox cmbox = e.Control as ComboBox;
cmbox.SelectedValueChanged += new EventHandler(cmbox_SelectedValueChanged);
}
}
你可以调用在下拉列表中选择cvalue改变事件的单元格的值更改事件
答
我最终这样做了。我不知道如果是这样的“首选”的方式或是否会产生任何副作用以后,但现在它似乎工作:
this.gridView.EditingControlShowing += this.GridViewOnEditingControlShowing;
private void GridViewOnEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
ComboBox cellComboBox = e.Control as ComboBox;
if (cellComboBox != null)
{
// make sure the handler doen't get registered twice
cellComboBox.SelectionChangeCommitted -= this.CellComboBoxOnelectionChangeCommitted;
cellComboBox.SelectionChangeCommitted += this.CellComboBoxOnelectionChangeCommitted;
}
}
private void CellComboBoxOnelectionChangeCommitted(object sender, EventArgs e)
{
DataGridViewComboBoxEditingControl comboBox = sender as DataGridViewComboBoxEditingControl;
if (sender == null)
{
return;
}
if (comboBox.SelectedValue == null)
{
return;
}
if (this.gridView.CurrentCell.Value == comboBox.SelectedValue)
{
return;
}
this.gridView.CurrentCell.Value = comboBox.SelectedValue;
}
这方法不起作用,因为该值尚未提交给底层DataGridViewCell.Value和DataGridView.CellValueChanged的EventHandler,我无法确定新值是什么。我需要找到一种方法来强制datagrid本身将更改提交给单元格并引发`CellValueChanged`事件。 – bitbonk 2011-01-20 08:51:41
在这种情况下,您可以使用SendKeys.Send(“{TAB}”)触发TAB事件;在组合框事件处理程序中强制单元失去焦点,最终触发网格的CellValueChanged – V4Vendetta 2011-01-20 10:32:08
这也不理想,因为当前单元格将失去焦点。这不应该发生在我的情况。 – bitbonk 2011-01-20 13:02:16