“DataGridViewComboBoxCell 值无效。”属性数据源
Posted
技术标签:
【中文标题】“DataGridViewComboBoxCell 值无效。”属性数据源【英文标题】:"DataGridViewComboBoxCell value is not valid." Property DataSource 【发布时间】:2011-11-03 23:05:51 【问题描述】:我有一个方法更新包含类型 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;
验证没有空值,引用很好
非常感谢您的帮助
【问题讨论】:
【参考方案1】:我已经尝试过使用 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)
【讨论】:
【参考方案2】:去这里http://msdn.microsoft.com/en-us/library/ms132679.aspx。
这是一个绑定列表。尝试将您的组合列数据放入绑定列表,然后将组合列的数据源设置为绑定列表。当您需要更改组合框中的内容时,不要将列的数据源设置为不同的 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 的效果一样。
这个问题可能有更好的解决方案,但这在过去对我有用。
【讨论】:
以上是关于“DataGridViewComboBoxCell 值无效。”属性数据源的主要内容,如果未能解决你的问题,请参考以下文章
DataGridViewComboBoxCell 的 SelectedIndex? VB.NET
“DataGridViewComboBoxCell 值无效。”属性数据源
DataGridViewComboBoxCell 绑定 - “值无效”
选择后 DataGridViewComboBoxCell 显示 Value 成员而不是 Display 成员