我有一个更新包含DataGridViewComboBoxCell类型的列的方法,早期的ComboBoxCell为空,选择一个产品并在添加新记录时更新ComboBoxCell,但是当我修改它时发送一个异常: “DataGridViewComboBoxCell值无效” 如果您重新分配DataSource属性,则不会。
这里的方法:
private void CargarTipoGasto(ref DataGridViewComboBoxCell ComboColumn)
{
ComboColumn.DataSource = from oPro in dtContext.tblProducto
where oPro.ProductoId == objProducto.ProductoId
from oMat in dtContext.tblMatrizDeCuentasGD
where oMat.Partida.Substring(0,3) ==
oPro.tblObjetoGasto.ObjetoGastoId.Substring(0,3)
from oTipGas in dtContext.tblTipoGasto
where oMat.TipoGasto == oTipGas.TipoGastoId
select oTipGas;
ComboColumn.ValueMember = TIPOGASTO_ID;
ComboColumn.DisplayMember = TIPOGASTO_VALOR;
}
verique没有空值,引用很好
非常感谢你的帮助
答案 0 :(得分:2)
我已经尝试过使用BindingList并得到了相同的异常 porfin可以解决它。
返回DataSource属性以指定在索引未命中时未找到的项目,以避免此论坛仅指定DataGridView存在“DataError”的事件并留空,这确实有效但不是很好看。
如何解决这个问题就是这么简单。 (字符串为空)
private void CargarTipoGasto(ref DataGridViewComboBoxCell ComboColumn)
{
ComboColumn.Value = string.Empty;
ComboColumn.DataSource = from oPro in dtContext.tblProducto
where oPro.ProductoId == objProducto.ProductoId
from oMat in dtContext.tblMatrizDeCuentasGD
where oMat.Partida.Substring(0,3) ==
oPro.tblObjetoGasto.ObjetoGastoId.Substring(0,3)
from oTipGas in dtContext.tblTipoGasto
where oMat.TipoGasto == oTipGas.TipoGastoId
select oTipGas;
ComboColumn.ValueMember = TIPOGASTO_ID;
ComboColumn.DisplayMember = TIPOGASTO_VALOR;
}
非常感谢您的帮助(IBC)
答案 1 :(得分:0)
转到http://msdn.microsoft.com/en-us/library/ms132679.aspx。
这是一个BindingList。尝试将combocolumn数据放入绑定列表,然后将combocolumn的数据源设置为绑定列表。当您需要更改组合框中的内容时,不要将列的数据源设置为不同的bindingList实例,请尝试清除原始绑定列表中的所有项目并逐个添加新的项目。当绑定列表的listChanged事件触发时,datagridviewcombobox应该更新。
当绑定列表包含大量项目时,这可能会有点麻烦。您可能想要创建一个继承自bindinglist的新类并将其放入其中:
public void clearAndAddList(List<T> newData)
{
this.Clear();
this.RaiseListChangedEvents = false;
foreach (var item in newData)
this.Add(item);
this.RaiseListChangedEvents = true;
this.ResetBindings();
}
这可以防止每次添加项目时触发listchanged事件。 ResetBindings似乎与触发listchanged具有相同的效果。
这个问题可能有更好的解决方案,但过去这对我有用。