使gridview数据源保持在接口中而不是转换为对象

时间:2009-03-27 10:52:29

标签: c# asp.net gridview datasource

我有一个C#网络应用程序,我有一个gridview,它采用List<>这需要一个接口。有三种对象类型可以实现列表中的接口。

我将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&lt;&gt;是以自己而不是界面的形式返回对象,还是在网格视图中将其丢弃?

或者我走错了路?

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

由于

乔恩霍金斯

修改

    

     <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“/&gt;

表示无法应用索引器。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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

希望这有帮助

代码发布后修改

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

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

如果失败,请遵循this blog post中的建议并创建自定义绑定字段控件。

答案 2 :(得分:0)

GridViewItemList.DataSource = listToDisplay.Select(x => new 
                              {
                                  Id = x.Id,
                                  Name = x.Name                        
                              })
                              .ToList();
GridViewItemList.DataBind();