我正在使用ADO.NET填充DataTable并绑定DataList并且它可以工作。但是,当我尝试使用DataTable中的Linq提取10条记录时,如下所示,我的代码给出了错误:
var xx=dt.asEnumerable().take(10).tolist();
dglist.datasource=xx;
dglist.databind();
<asp:DataList ID="dglist" runat="server"
RepeatColumns="4" RepeatDirection="Horizontal"
RepeatLayout="Table" CellPadding="1">
<ItemTemplate>
<div>
<asp:Image runat="server" id="Image1"
src='<%# Eval("photos") %>' BorderWidth="0"
alt="" style="width:300px;height:300px;display:block;"/>
</div>
</ItemTemplate>
</asp:DataList>
我的DataTable有一列名为“照片”。我绑定到DataList时收到错误。请指导我如何使用Linq从DataTable中提取10条记录并将DataList与10条记录绑定。
我有另一个问题。
datatable.asEnumerable()
的含义及其作用是什么?它似乎通过asEnumerable()将DataTable转换为什么?
答案 0 :(得分:1)
DataTable
实现了IListSource
接口,它支持对列名进行数据绑定(因此Eval("photos")
有效)。但是当您在AsEnumerable()
上致电DataTable
时,它会返回IEnumerable<DataRow>
,其中DataRow个对象将没有名为photos
的属性,这就是您获得的原因例外。但是,如果您在eval中使用索引器并使用列名称,则可以使其工作:
var xx = dt.AsEnumerable().Take(10).ToList();
dglist.DataSource = xx;
dglist.DataBind();
<asp:DataList ID="dglist" runat="server"
...
<asp:Image runat="server" id="Image1"
src='<%# Eval("[photos]") %>' BorderWidth="0"
alt="" style="width:300px;height:300px;display:block;"/>
...
</asp:DataList>
或者您使用AsDataView()扩展方法。需要OfType<object>()
才能将非泛型集合设置为通用集合以支持LINQ。在这种情况下,您无需在Eval
方法中使用索引器:
var xx = dt.AsDataView().OfType<object>().Take(10).ToList();
dglist.DataSource = xx;
dglist.DataBind();
<asp:DataList ID="dglist" runat="server"
....
<asp:Image runat="server" id="Image1"
src='<%# Eval("photos") %>' BorderWidth="0"
alt="" style="width:300px;height:300px;display:block;"/>
....
</asp:DataList>