C# System.InvalidCastException:System.Data.DataViewManagerListItemTypeDescriptor

C# System.InvalidCastException:System.Data.DataViewManagerListItemTypeDescriptor,c#,exception,C#,Exception,我随机得到一个异常。我有一个条形码扫描仪,可以将条形码输入表格。代码是用C#编写的。一开始我可以得到两次异常;然而,我不再能够生成它。异常为System.InvalidCastException:无法将类型为“System.Data.DataViewManagerListItemTypeDescriptor”的对象强制转换为类型为“System.Data.DataRowView”。我首先扫描了两个不同的水瓶,每个水瓶扫描2-3次。然后,当我点击保存按钮时,我得到了异常。我曾尝试过谷歌搜索是否有人

我随机得到一个异常。我有一个条形码扫描仪,可以将条形码输入表格。代码是用C#编写的。一开始我可以得到两次异常;然而,我不再能够生成它。异常为System.InvalidCastException:无法将类型为“System.Data.DataViewManagerListItemTypeDescriptor”的对象强制转换为类型为“System.Data.DataRowView”。我首先扫描了两个不同的水瓶,每个水瓶扫描2-3次。然后,当我点击保存按钮时,我得到了异常。我曾尝试过谷歌搜索是否有人曾经犯过这个错误,但在相同的背景下找不到有类似问题的人。在以下代码段中引发异常:

foreach (object o in this.theBindingSource.List) { System.Data.DataRowView dataRowView1 = (System.Data.DataRowView)o; } foreach(此.theBindingSource.List中的对象o) { System.Data.DataRowView dataRowView1=(System.Data.DataRowView)o; } 显然,有时o的类型是System.Data.DataViewManagerListItemTypeDescriptor,而不是System.Data.DataRowView。知道为什么会抛出此异常吗


BindingSource正在由数据库填充:

XYZDataAccess.TypedDataSets.ABCTag tags = XYZDataAccess.DAL.ABCTagDAL.GetABCTags( DeliverySession.DeliverySessionId); if (tags != null && tags.Tables[0] != null) { theBindingSource.Sort = ""; theBindingSource.DataSource = tags; } XYZDataAccess.TypedDataSets.ABCTag标记 =XYZDataAccess.DAL.ABCTagDAL.GetABCTags( DeliverySession.DeliverySessionId); if(tags!=null&&tags.Tables[0]!=null) { theBindingSource.Sort=“”; BindingSource.DataSource=标记; }
我必须在绑定源中循环的原因是另一个DataGridView需要填充bindindg源的内容;此外,DataGridView为控件或视图中的数据实现了自定义排序。除了删除对列表的直接访问之外,我是否应该指定DisplayMember属性?

是BindingSource的有效结果,特别是当绑定到的项未正确指定.DisplayMember时。手动循环绑定源是否有特定的原因?绑定源的目的是将其绑定到特定控件,并从数据库中自动填充这些控件

无论如何,我还没有测试以下代码,但您可能会更幸运:

foreach (object o in this.theBindingSource)
{
    System.Data.DataRowView dataRowView1 = (System.Data.DataRowView)o;
}
BindingSource已经是IEnumerable,因此您不必直接访问该列表

更新

您可以这样做来填充DataGridView,而不是循环浏览,如:

theBindingSource.DataSource = tags;
yourDataGridView.DataSource = theBindingSource;

我相信.DisplayMember只在ListView之类的东西上是必需的,但我对此并不肯定。

您如何填充BindingSource?BindingSource由数据库填充:XYZDataAccess.TypedDataSets.ABCTag tags=XYZDataAccess.DAL.ABCTagDAL.GetABCTags(DeliverySession.DeliverySessionId);if(tags!=null&&tags.Tables[0]!=null){theBindingSource.Sort=“”;theBindingSource.DataSource=tags;}我在DataGridView.CellFormatting事件中遇到了相同的错误-我希望行的DataBoundItem是DataRowView,但它是DataViewManagerListItemDescriptor。我不知道为什么会发生这种情况,但触发器似乎是我将BindingSource.DataSource从类型化数据集更改为null,然后将其设置为有效的t再次使用类型化数据集。将数据源更改回类型化数据集会导致错误。为了避免错误,我避免将数据源设置为null。我必须循环使用绑定源的原因是需要使用bindindg源的内容填充另一个DataGridView;此外,DataGridView实现了自定义的为控件或视图中的数据执行orting。除了删除对列表的直接访问之外,我是否应该指定DisplayMember属性?为什么BindingSource包含DataViewManagerListItemTypeDescriptor而不是DataRowViews?