过去几天一直试图解决这个问题,这真让我感到沮丧。我只在GridView
内显示了一条记录。
以下是我正在使用的LINQ代码:
public IQueryable GetSubCatWithCatName()
{
return
(from sc in this.Entities.SubCategory
join c in this.Entities.Category
on sc.CategoryID equals c.ID
select new
{
sc.ID,
CategoryName = c.Name,
SubCategoryName = sc.Name,
SubCategoryImage = sc.ImageURL
});
}
我在GridView
组件中显示结果,但只显示第一条记录
我已尝试过上述代码的其他几个版本无济于事。
有人请帮忙吗?
以下是GridView
的定义方式,如果有任何帮助的话。
<asp:GridView ID="gvSubCategories" runat="server" DataKeyNames="ID" AutoGenerateColumns="false"
onrowdatabound="gvSubCategories_RowDataBound"
onselectedindexchanged="gvSubCategories_SelectedIndexChanged">
<Columns>
<asp:CommandField ShowSelectButton="true" />
<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="imgSubCategory" runat="server" Width="100px" Height="100px" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CategoryName" HeaderText="Category Name" />
<asp:BoundField DataField="SubCategoryName" HeaderText="Sub Category Name" />
<asp:BoundField DataField="SubCategoryImage" HeaderText="Sub Category Image" />
</Columns>
</asp:GridView>
在.cs Class
中gvSubCategories.DataSource = new BASubCategory().GetSubCatWithCatName();
gvSubCategories.DataBind();
在BASubCategories中
public IQueryable GetSubCatWithCatName()
{
return new DASubCategory(this.Entities).GetSubCatWithCatName();
}
在DASubCategories中
public IQueryable GetSubCatWithCatName()
{
return
(from sc in this.Entities.SubCategory
join c in this.Entities.Category
on sc.CategoryID equals c.ID
select new
{
sc.ID,
CategoryName = c.Name,
SubCategoryName = sc.Name,
SubCategoryImage = sc.ImageURL
});
}
RowDataBound中的
protected void gvSubCategories_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
SubCategory currentSubCat = (SubCategory)e.Row.DataItem;
//Image img = (Image)e.Row.FindControl("imgSubCategory");
//img.ImageUrl = currentSubCat.ImageURL;
}
}
答案 0 :(得分:1)
根据对question其他版本的评论,OnRowDatabound处理程序似乎有问题。您的Linq查询返回一个动态对象。在处理程序中,将其强制转换为Subcategory类型的对象。这将失败 - 虽然我无法解释为什么这只会在第一个要显示的记录中结束。可能与吞噬错误的页面级或全局错误处理程序有关。效果似乎是GridView在第一行触发错误后停止绑定 为了解决这个问题,我建议创建一个类,其中包含要从Linq查询返回的属性以及GrifView和OnRowDatabound处理程序中所需的属性。在处理程序中,强制转换为此类型并根据需要使用数据。
答案 1 :(得分:0)
我建议您对数据源执行ToList()
。我不确定这是否是您遇到的问题,但有时对于IEnumerable<>
,如果在枚举发生之前处理了某些依赖项,则可能会阻止它完全执行。例如,如果this.Entities
在页面呈现之前变为无效,则可能会导致问题。所以这样做:
gvSubCategories.DataSource = new BASubCategory().GetSubCatWithCatName().ToList();
gvSubCategories.DataBind();