【发布时间】:2011-01-19 16:12:03
【问题描述】:
一旦单元格中的ComboBox 编辑控件更改其选择,我如何强制引发DataGridView.CellValueChanged 事件(并将更改实际提交给DataGridViewCell.Value 属性)?默认情况下,只有在具有 ComboBox 的单元格失去焦点后才会引发该事件。
【问题讨论】:
标签: datagridview combobox focus
一旦单元格中的ComboBox 编辑控件更改其选择,我如何强制引发DataGridView.CellValueChanged 事件(并将更改实际提交给DataGridViewCell.Value 属性)?默认情况下,只有在具有 ComboBox 的单元格失去焦点后才会引发该事件。
【问题讨论】:
标签: datagridview combobox focus
我解决了这个问题:
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;
}
【讨论】:
EditingControlFormattedValue 属性)并且无法确认它确实有效,但它看起来确实比我的方法正确且噪音更少。所以我接受这个作为答案。
EditingControlFormattedValue 更改为 SelectedValue,但为我工作。
我最终这样做了。我不知道这是否是“首选”方式,或者以后是否会产生任何副作用,但现在它似乎有效:
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;
}
【讨论】:
combobox值的变化实际上是一个与Grid关联的Editing控件。 因此,要启动任何内容,您必须在 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);
}
}
可以在Combobox的选中的cvalue改变事件中调用单元格值改变事件
【讨论】:
DataGridViewCell.Value,并且在DataGridView.CellValueChanged 的EventHandler 中我无法找出新值是什么。我需要找到一种方法来强制数据网格本身将更改提交到单元格并引发CellValueChanged 事件。