我有一个GridView,通过分页一次只能显示50条记录。如果我将其绑定到包含150条记录的消息源,它的工作原理就像魅力,但是当记录大小急剧增加到10,00000时,加载数据花费了很多时间。.因此,我想知道有什么方法可以仅加载50条记录一次可见的记录??
我想要类似“延迟加载”或wpf中的“虚拟化堆栈面板”功能。
这就是我绑定到GridView的方式
private void LoadCustomers() { if (Cache["CustomersData"] == null) { Business.Customers customers = Business.Customers.GetAllCustomer(); Cache["CustomersData"] = customers; } this.customerGridView.DataSource = Cache["CustomersData"]; this.customerGridView.DataBind(); }
这是从DB-获取数据的函数
public static Customers GetAllCustomer(int index) { Customers customers = new Customers(); NShop_SmallEntities data = new NShop_SmallEntities(); var dbCustomers = (from c in data.Customers select c).OrderBy(c=> c.CustomerId).Skip(index * 50).Take(50); foreach (var dbCustomer in dbCustomers) { customers.Add(Customer.GetCustomer(dbCustomer)); } return customers; } public static Customer GetCustomer(DAL.Customer dbCustomer) { return new Customer() { CustomerId = dbCustomer.CustomerId, FirstName = dbCustomer.FirstName, LastName = dbCustomer.LastName, Email = dbCustomer.Email, DOB = dbCustomer.DOB, City = dbCustomer.City, State = dbCustomer.State, PostalCode = dbCustomer.PostalCode, Country = dbCustomer.Country, OrderCount = dbCustomer.Orders.Count() }; }
这是根据您的更改,我将如何处理:
public static Customers GetAllCustomer(int startIndex, int nbrOfResults, out total) { Customers customers = new Customers(); NShop_SmallEntities data = new NShop_SmallEntities(); var dbCustomers = from c in data.Customers select c; // Retreiving total number of customers. NEEDED to get // ObjectDataSource working. total = dbCustomers.Count(); foreach (var dbCustomer in dbCustomers .Skip((startIndex * nbrOfResults) + 1) .Take(NumberOfResults).ToList() { customers.Add(Customer.GetCustomer(dbCustomer)); } return customers; } /// <summary> /// This methods must have the same signature than the "real" one... exept the name :oP /// </summary> public static int GetAllCustomerCount(int startIndex, int nbrOfResults, out total) { return (from c in data.Customers select c).Count(); }
现在在您的页面中;
<asp:GridView ID="gvBulletins" runat="server" AllowPaging="True" ObjectDataSourceID="objCustomersDS"> </asp:GridView> <asp:ObjectDataSource ID="objCustomersDS" runat="server" SelectMethod="GetAllCustomer" SelectCountMethod="GetAllCustomerCount" TypeName="AssemblyName" EnablePaging="True" MaximumRowsParameterName="nbrOfResults" StartRowIndexParameterName="startIndex"> <SelectParameters> <asp:Parameter Name="startIndex" Type="Int32" /> <asp:Parameter Name="nbrOfResults" Type="Int32" /> <asp:Parameter Direction="Output" Name="total" Type="Int32" /> </SelectParameters> </asp:ObjectDataSource>