2009-02-19 15 views
11

Tôi đang cố gắng tìm ra cơ chế phân trang của GridView của ASP.NET để tôi có thể sử dụng chức năng gốc của khung công tác thay vì các thủ tục phân trang thủ công do nhà sản xuất của công ty tôi thực hiện, thực hiện rất nhiều công việc để triển khai.Cài đặt thủ công PageCount của GridView khi DataSource không trả về tập hợp kết quả đầy đủ?

Tôi đã tìm ra mọi thứ ngoại trừ cách lấy thuộc tính PageCount của GridView để làm việc với các dịch vụ web của chúng tôi. Hiện nay, các dịch vụ web của chúng tôi trả lại tổng số kỷ lục như sau:

public object[] GetStuffMethod(int pageNum, int recordsPerPage, out int totalRecords) 

này hoạt động tốt với một GridView, tuy nhiên các tài liệu tôi đã tìm thấy nói rằng PageCount tài sản 's GrideView được tạo ra từ tổng số hồ sơ trong DataSource. Có thực sự không có cách nào để thiết lập PageCount dựa trên một cái gì đó khác hơn là trả lại tất cả các hồ sơ?

Có thể có hàng chục nghìn bản ghi trong nguồn dữ liệu của tôi vì vậy tôi không muốn chọn tất cả chúng chỉ để làm cho số lượng trang của GridView hoạt động. Tôi có lẽ chỉ có thể bỏ qua số trang của GridView và tính nó trên của riêng tôi, nhưng nếu khuôn khổ có một cách để làm điều này, tôi muốn sử dụng nó.

+0

bạn đã thử câu trả lời chưa? – eglasius

Trả lời

8

Tôi khuyên bạn đi con đường ObjectDataSource.

Nếu bạn không quen với cách tiếp cận này, đây là những điều cơ bản:

1) Thay vì tự thiết lập thuộc tính grid.DataSource trong mã phía sau, bạn thêm một yếu tố thêm vào trang. Bạn đặt DataSourceID của lưới thành id của ObjectDataSource của bạn.

2) Đây là nơi bạn có quyền kiểm soát thực sự. Bạn tạo một lớp mới và cung cấp cho nó hai hàm "SelectRows()" và "GetCount()". Bạn có thể đặt logic của bạn trong cả hai chức năng và tối ưu hóa nội dung trái tim của bạn. Vui lòng sử dụng các dịch vụ web nếu đó là những gì bạn cần để làm việc với, nhưng theo phương pháp này, bạn có thể gọi một để trả về hàng và khác để trả về số.

3) sử dụng trình chỉnh sửa thuộc tính của ObjectDataSource để kết nối nó với lớp của bạn và bật phân trang. Bạn đã hoàn tất!

Tôi đặc biệt khuyên bạn nên xem The Code Project's Example of using ObjectDataSource and GridView vì đây rõ ràng là cách dự định để hỗ trợ những gì bạn muốn.

Chúc may mắn!

5

Bạn phải đặt AllowCustomPaging = "true". Và khi databinding làm:

mygrid.VirtualItemCount = totalRecords; 
mygrid.DataSource = mysource; 
mygrid.DataBind(); 

Cập nhật 1: Trên đây là chỉ DataGrid. Thật không may là cách duy nhất được hỗ trợ để thực hiện phân trang bên máy chủ với GridView là triển khai nguồn dữ liệu đối tượng hoặc triển khai nguồn dữ liệu tùy chỉnh. Đây là tài liệu liên quan msdn doc http://msdn.microsoft.com/en-us/library/5aw1xfh3.aspx.

Cập nhật 2: Phương pháp này hiện đang làm việc với GridView như của Net 4.5

+1

VirtualItemCount chỉ hoạt động với các điều khiển DataGrid. Trên GridView, thuộc tính này không tồn tại, nếu không tôi sẽ sử dụng nó. –

+1

@Bạn có chính xác không, tôi đã thêm một bản cập nhật về nó - về cơ bản bạn buộc phải đi với bộ nguồn đối tượng hoặc nguồn dữ liệu tùy chỉnh. Đã thêm liên kết vào tài liệu msdn. – eglasius

+3

Thuộc tính này dường như tồn tại trên GridView kể từ .Net 4.5 [msdn] (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.virtualitemcount% 28v = vs.110% 29.aspx) – sparebytes

Các vấn đề liên quan