C# 使gridview数据源留在接口中,而不是向下转换到对象
我有一个C#web应用程序,其中我有一个gridview,它获取一个列表,该列表包含一个接口。有三种对象类型实现列表中的接口 我将gridviews数据源设置为list并调用databind。当我运行应用程序时,出现以下错误:C# 使gridview数据源留在接口中,而不是向下转换到对象,c#,asp.net,gridview,datasource,C#,Asp.net,Gridview,Datasource,我有一个C#web应用程序,其中我有一个gridview,它获取一个列表,该列表包含一个接口。有三种对象类型实现列表中的接口 我将gridviews数据源设置为list并调用databind。当我运行应用程序时,出现以下错误: {"Property accessor 'Name' on object 'Bailey.Objects.Company' threw the following exception:'Object does not match target type.'"} 我在列表
{"Property accessor 'Name' on object 'Bailey.Objects.Company' threw the following exception:'Object does not match target type.'"}
我在列表中改变了对象的顺序,发现第一个对象类型工作得很好,但是当它找到另一个对象的第一个实例时,就会抛出这个错误
List<IBaileyObject> listToDisplay = listofItems;
GridViewItemList.DataSource = listToDisplay;
GridViewItemList.DataBind();
List listToDisplay=listofItems;
GridViewItemList.DataSource=listToDisplay;
GridViewItemList.DataBind();
我想要的是数据源和绑定保持在接口上,而不是像看起来那样向下转换到对象
这是因为列表以对象本身而不是接口的形式返回对象,还是gridview中的某个对象正在将其向下转换
还是我走错了路
我希望有人有办法解决这个问题
谢谢
乔恩·霍金斯
编辑
该接口公开名称、ID和TypeName
“HeaderText=“ID”Visible=“False”/
gives无法应用索引器。能否发布一些GridView代码(特别是在引用IBaileyObject属性的地方) 不知道您使用的语法会使事情变得困难,但您是否尝试过这样做:
<%# (((IBaileyObject)Container.DataItem)["PropertyX"]) %>
希望这有帮助
发布代码后编辑
我认为这是因为您使用的是“BoundField”,它们不够聪明,无法确定您引用的成员来自何处。我的建议是将您的BoundField转换为数据绑定语法:
或者:
或者,
否则,请按照中的建议创建自定义绑定字段控件。我非常喜欢此解决方案:
它使用一个自定义的BoundField类,该类使用Eval返回值。比在ASPX页面中使用Eval稍微好一些…我希望我能对此进行100万次投票。超级简单,适用于各种场景。请添加解释在上述解决方案中,我使用了原始海报中的列表listToDisplay=ListoItems。
GridViewItemList.DataSource = listToDisplay.Select(x => new
{
Id = x.Id,
Name = x.Name
})
.ToList();
GridViewItemList.DataBind();
GridViewItemList.DataSource = listToDisplay.Select(x => new
{
Id = x.Id,
Name = x.Name
})
.ToList();
GridViewItemList.DataBind();