4

我有一个 C# Web 应用程序,其中有一个带有 List<> 接口的 gridview。列表中存在三种实现接口的对象类型。

我将gridviews 数据源设置为列表并调用databind。当我运行应用程序时,我收到以下错误:

{"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<> 将对象作为它自己而不是接口返回,还是因为它在 gridview 中的某些东西正在向下投射?

还是我走错了路?

我希望有人有办法解决这个问题。

谢谢

乔恩·霍金斯

编辑

     <asp:TemplateField HeaderText="Selected">
                    <ItemTemplate>
                        <asp:CheckBox runat="server" ID="chkbox" Width="10%" Enabled="true" AutoPostBack="false" />
                    </ItemTemplate>
                </asp:TemplateField>

    <asp:BoundField DataField="ID" HeaderText="ID" Visible="False" />
    <asp:BoundField DataField="Name" HeaderText="Name" />
    <asp:BoundField DataField="TypeName" HeaderText="Type" />
</Columns>
<FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#E3EAEB" />    

<PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#7C6F57" />
<AlternatingRowStyle BackColor="#F8F8F8" />    

该接口公开了 Name、ID 和 TypeName。

" HeaderText="ID" Visible="False" />

给出不能应用索引器。

4

3 回答 3

3

我真的很喜欢这个解决方案:http: //iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

它使用自定义 BoundField 类,该类使用 Eval 返回值。比在 ASPX 页面中使用 Eval 好一点...

于 2010-01-06T16:01:33.033 回答
1

你能发布一些你的 GridView 代码(特别是你引用你的 IBaileyObject 属性的地方)吗?

不知道您使用的是什么语法会使事情变得困难,但是您是否尝试过这样做:

<%# (((IBaileyObject)Container.DataItem)["PropertyX"]) %>

希望这可以帮助

发布代码后编辑

我认为这是因为您使用的是“BoundField” - 他们不够聪明,无法确定您所指的成员来自哪里。我的建议是将您的 BoundFields 转换为数据绑定语法:

要么:<%# Eval("Id") %> 要么,<%# (((IBaileyObject)Container.DataItem)["Id"]) %>

如果做不到这一点,请遵循此博客文章中的建议并创建自定义绑定字段控件。

于 2009-03-27T13:34:16.250 回答
0
GridViewItemList.DataSource = listToDisplay.Select(x => new 
                              {
                                  Id = x.Id,
                                  Name = x.Name                        
                              })
                              .ToList();
GridViewItemList.DataBind();
于 2015-02-26T03:35:32.120 回答