使gridview数据源留在界面中而不是向下转换为对象

Posted

技术标签:

【中文标题】使gridview数据源留在界面中而不是向下转换为对象【英文标题】:Make gridview datasource stay in interface not cast down to object 【发布时间】:2010-10-15 21:56:17 【问题描述】:

我有一个 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" />

gives 不能应用索引器。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我希望我能投票一百万次。超级简单,适用于各种场景。【参考方案2】:

您能否发布一些您的 GridView 代码(特别是您引用 IBaileyObject 属性的位置)?

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

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

希望对你有帮助

代码发布后编辑

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

要么:&lt;%# Eval("Id") %&gt; 或者,&lt;%# (((IBaileyObject)Container.DataItem)["Id"]) %&gt;

如果做不到这一点,请遵循 this blog post 中的建议并创建自定义绑定字段控件。

【讨论】:

【参考方案3】:
GridViewItemList.DataSource = listToDisplay.Select(x => new 
                              
                                  Id = x.Id,
                                  Name = x.Name                        
                              )
                              .ToList();
GridViewItemList.DataBind();

【讨论】:

请补充说明 在上述解决方案中,我使用了 List listToDisplay = listofItems;来自原始海报。

以上是关于使gridview数据源留在界面中而不是向下转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

UWP GridView切换数据时界面闪动

jQuery对话框在屏幕上闪烁,而不是留在用户输入

vs里gridview控件创建的数据库表格怎么居中

如何正确检查是不是成功向下转换为 AnyObject?

从 javascript 函数更改 GridView 中的组件属性

在Windows 8中过滤GridView