System.InvalidCastException:System.Data.DataViewManagerListItemTypeDescriptor

时间:2009-06-09 14:29:26

标签: c# exception

随机获得一个例外。我有一个条形码扫描仪,它将条形码输入表格。代码是用C#编写的。我最初能够两次获得异常;但是,我不再能够生成它。 System.InvalidCastException异常:无法将类型为'System.Data.DataViewManagerListItemTypeDescriptor'的对象强制转换为'System.Data.DataRowView'。我首先通过扫描2个不同的水瓶来生成它,每个水瓶2-3次。然后当我点击保存按钮时,我得到了例外。我曾尝试使用Google进行研究,以确定其他人之前是否有此错误,但在相同的上下文中找不到任何有类似问题的人。以下代码段中抛出异常:

 foreach (object o in this.theBindingSource.List)
 {
   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;
            }

我必须遍历绑定源的原因是需要使用bindindg源的内容填充另一个DataGridView;此外,DataGridView为控件或视图中的数据实现了自定义排序。我应该指定DisplayMember属性吗?

除了删除List的直接访问权限

1 个答案:

答案 0 :(得分:2)

System.Data.DataViewManagerListItemTypeDescriptor 是来自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仅对ListViews这样的东西是必要的,但我对此并不乐观。