网格视图使用List()时绑定问题

时间:2011-09-18 09:20:22

标签: c# asp.net linq gridview paging

.aspx:

 <asp:GridView ID="gvFirst" runat="server" AutoGenerateColumns="false" 
        AllowPaging="true" 
        ondatabound="gvFirst_DataBound" >
        <Columns>
            <asp:BoundField DataField="ID" HeaderText="ProductID"/>
            <asp:BoundField DataField="Name" HeaderText="ProductName" />
        </Columns>
        <PagerTemplate>
            <asp:Panel ID="pnlPager" runat="server">
            </asp:Panel>
        </PagerTemplate>
    </asp:GridView>

.cs:

 public class Productinformation
    {
     public int PID
     {
         get;
         set;
     }
     public string PName
     {
         get;
         set;
     }
    }
       using (NorthWindDataContext _NorthWindDataContext = new NorthWindDataContext())
        {
            Proinfo = new List<Productinformation>();
            Proinfo = (from p in _NorthWindDataContext.Products
                       select new Productinformation
                       {
                           PID = p.ProductID,
                           PName = p.ProductName,
                       }).ToList();

            gvFirst.DataSource =  Proinfo.Take(PageSize) ;
            gvFirst.DataBind();
        }
全局声明

Proinfo变量。现在,当我运行此代码时,它显示以下错误:

  

数据源不支持服务器端数据分页

如果我使用var类型的变量,那么它可以工作但是 我们不能全局声明var类型的变量,所以如果我使用它,那么每次在分页时我都必须调用这个方法。我不想使用Objectdatasource

2 个答案:

答案 0 :(得分:1)

您必须使用gvFirst方法将列表返回ToList()。所以试试这个:

gvFirst.DataSource =  Proinfo.Take(PageSize).ToList();

解释

因为gvFirst设置了属性AllowPaging="true",所以分页可以与任何实现ICollection接口的数据源对象一起使用。

ProInfo.Take(PageSize)会返回IEnumerable,这就是您需要调用ToList()方法的原因。

答案 1 :(得分:1)

如果你将全局声明Proinfo称为ICollection

private ICollection<Productinformation> Proinfo = null

然后你使用.Take方法得到的结果是一个不支持分页的枚举,所以你必须把它转换成一个继承ICollection的List。

gvFirst.DataSource =  Proinfo.Take(PageSize).ToList();