“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 成员

winform循环向DataGridViewComboBoxCell添加值

c# 获取 DatagridviewComboBoxCell 的选定值