GridView 會依據資料筆數 和 GridView.PageCount 自動計算出頁數。
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { GridView1.DataSource = GetData(); GridView1.DataBind(); } } private DataTable GetData() { // 讀取資料 } // 翻頁時改變 PageIndex 後重新綁定 GridView 的資料 protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView gridview = (GridView)sender; GridView.PageIndex = e.NewPageIndex; GridView.DataSource = GetData(); GridView.DataBind(); }因為GridView其實是將全部的資料都載入後,只顯示某一頁的資訊出來,所以當讀取的資料太多時就會造成載入的間很久。
此時可以使用自訂分頁的方式,自訂分頁除了要將 GridView 的屬性 AllowPaging 設為 true 之外,還要將 GridView 的屬性 AllowCustomPaging 設為 true,然後再在程式碼中指定 GridView.VirtualItemCount (虛擬 GridView 總共有幾筆資料),然後 GridView 會依據 VirtualItemCount 和 GridView.PageCount 自動計算出頁數,具體做法大致如下:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // GridView.VirtualItemCount:虛擬 GridView 總共有幾筆資料 GridView1.VirtualItemCount = GetAllDataCount(); GridView1.DataSource = GetSpecPageData(0); GridView1.DataBind(); } } private int GetAllDataCount() { // 讀取全部資料的筆數 } /// 只讀取指定頁的資料 private DataTable GetSpecPageData(int PageIndex) { // 比方每頁要顯示 15 筆 // 讀取第一頁要顯示的資料,那就只讀取 TOP 15 // 或是若要讀取第三頁 31 到第 45 筆,則可以用 OFFSET 30 ROWS FETCH NEXT 15 ROWS ONLY // 意思是是位移 30 筆之後,再往下取 15 筆資料 請參考MIS2000 Lab } 翻頁時改變 PageIndex 後重新綁定 GridView 的資料 protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView gridview = (GridView)sender; GridView.PageIndex = e.NewPageIndex; GridView.DataSource = GetSpecPageData(e.NewPageIndex); GridView.DataBind(); }此時遇到的題目是 GridView 的每頁筆數不一致(比方某個欄位要固定只顯示幾種資料),所以除了上述的寫法之外,還要加上一點點修正,如下:
加上一個全域變數,用以儲存每頁的筆數資訊
Dictionary<int, int> dictCountPerPage;
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { dictPerPageCount = GetPerPageCount(); GridView1.PageCount = dictPerPageCount[0]; // 指定第一頁的筆數// GridView.VirtualItemCount:計算虛擬 GridView 總共有幾筆資料(因為每頁筆數不一,所以以要顯示的該頁的筆數當基準,用以計算出虛擬總筆數,好產生頁數(碼) GridView1.VirtualItemCount = GridView1.PageCount * dictPerPageCount.Count; GridView1.DataSource = GetSpecPageData(0); GridView1.DataBind(); } } /// 依需求記錄每頁要顯示的資料筆數 /// Key: 頁碼, Value: 每頁到第幾筆資料 private Dictionary<int, int> GetPerPageCount() { // 讀取全部每頁的資料的筆數 // 例如: // Dictionary<int, int> dict = new Dictionary<int, int>(); // dict.Add(0, 10); // 第 1 頁: 0~10 筆 // dict.Add(1, 16); // 第 2 頁: 11~16 筆 // dict.Add(2, 18); // 第 3 頁: 17~18 筆 // dict.Add(3, 22); // 第 4 頁: 19~22 筆 // Session.Add("PerPageCount", dictPerPageCount); 將分頁資訊記錄在 Session // return dict; }/// 只讀取指定頁的資料 private DataTable GetSpecPageData(int PageIndex) { // 比方每頁要顯示 15 筆 // 讀取第一頁要顯示的資料,那就只讀取 TOP 15 // 或是若要讀取第三頁 31 到第 45 筆,則可以用 OFFSET 30 ROWS FETCH NEXT 15 ROWS ONLY // 意思是是位移 30 筆之後,再往下取 15 筆資料 請參考MIS2000 Lab // SQL 語法: StringBuilder SQL = new StringBuilder("..."); SQL.Append(" ORDER BY 1, 2, 3, 4"); // 取回第幾筆~第幾筆資料 if (CurrentPage == 0) SQL.AppendFormat(" OFFSET {0} ROWS FETCH NEXT {1} ROWS ONLY", 0, dicRowCountPerPage[CurrentPage]); else SQL.AppendFormat(" OFFSET {0} ROWS FETCH NEXT {1} ROWS ONLY", dictCountPerPage[PageIndex- 1], dictCountPerPage[PageIndex] - dictCountPerPage[PageIndex- 1]); // 每次都重新指定 PageCount 和 VirtualItemCount if (PageIndex== 0) GridView1.PageSize = dictCountPerPage[PageIndex]; else GridView1.PageSize = dictCountPerPage[PageIndex] - dictCountPerPage[PageIndex - 1]; GridView1.VirtualItemCount = GridView1.PageSize * dictCountPerPage.Count; } /// 翻頁時改變 PageIndex 後重新綁定 GridView 的資料 protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView gridview = (GridView)sender; GridView.PageIndex = e.NewPageIndex; if (dictCountPerPage == null) dictCountPerPage = (Dictionary<int, int>)Session["PerPageCount"]; GridView.DataSource = GetSpecPageData(e.NewPageIndex); GridView.DataBind(); }