1、分頁的存儲過程:
create proc PageNum @PageSize int, --每頁顯示條數 @PageIndex int, --當前是第幾頁 @totalRows int output, --總行數 @totalPages int output --總頁數 as declare @startId int declare @endId int set @startId = @PageSize*(@PageIndex-1)+1 set @endId = @startId+@PageSize-1 select @totalRows=COUNT(*) from Books set @totalPages=@totalRows/@PageSize if(@totalRows%@PageSize != 0) --如果總行數除每頁顯示數據量的值不等於0,則總頁數得加1 begin set @totalPages=@totalPages+1 end declare @IndexTable table(Id int identity(1,1) ,nId int) insert into @IndexTable select Id from Books select * from @IndexTable as t ,Books as b where t.Id>=@startId and t.Id<=@endId and t.nId=b.Id go declare @tr int --總行數 declare @tp int --總頁數 exec PageNum 4,2,@tr output ,@tp output print '這是總頁數'+convert(varchar,@tp) --數據轉換 print @tr
2.可以一次性讀到DataTable后,再做處理
private int pageSize = 0; //每頁顯示行數 private int pageCurrent = 0; //當前頁號 private int pageCount = 0; //頁數=總記錄數/每頁顯示行數 private int nCurrent = 0; //當前記錄行號 private int nMax = 0; //總記錄數 private DataTable srcTable = null; //元數據 private void First_Click(object sender, EventArgs e) { try { pageCurrent = 1; //當前頁數從1開始 nCurrent = 0; //當前記錄數從0開始 if (srcTable == null || srcTable.Rows.Count == 0) return; DataTable table = LoadPageData(); ChangeDataSoure(table); First.Enabled =false; Prev.Enabled = false; Next.Enabled = true; End.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Prev_Click(object sender, EventArgs e) { try { pageCurrent--; nCurrent = pageSize * (pageCurrent - 1); if (srcTable == null || srcTable.Rows.Count == 0) return; DataTable table = LoadPageData(); ChangeDataSoure(table); bool b = pageCurrent <= 1 ? false : true; First.Enabled = b; Prev.Enabled = b; Next.Enabled = true; End.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Next_Click(object sender, EventArgs e) { try { pageCurrent++; nCurrent = pageSize * (pageCurrent - 1); if (srcTable == null || srcTable.Rows.Count == 0) return; DataTable table = LoadPageData(); ChangeDataSoure(table); bool b = pageCurrent >= pageCount ? false : true; Next.Enabled = b; End.Enabled = b; First.Enabled = true; Prev.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void End_Click(object sender, EventArgs e) { try { pageCurrent = pageCount; nCurrent = pageSize * (pageCurrent - 1); if (srcTable == null || srcTable.Rows.Count == 0) return; DataTable table = LoadPageData(); ChangeDataSoure(table); Next.Enabled =false; End.Enabled = false; First.Enabled = true; Prev.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void InitPageSet() { pageSize = 30; //設置頁面行數 nMax = srcTable.Rows.Count; pageCount = (nMax / pageSize); //計算出總頁數 if ((nMax % pageSize) > 0) { pageCount++; } pageCurrent = 1; //當前頁數從1開始 nCurrent = 0; //當前記錄數從0開始 First.Enabled =false; Prev.Enabled = false; bool b = pageCurrent == pageCount ? false : true; Next.Enabled = b; End.Enabled = b; } private DataTable LoadPageData() { int nStartPos = 0; //當前頁面開始記錄行 int nEndPos = 0; //當前頁面結束記錄行 DataTable dtTemp = null; if (srcTable == null || srcTable.Rows.Count == 0) return srcTable; try { dtTemp = srcTable.Clone(); //克隆DataTable結構框架 if (pageCurrent == pageCount) { nEndPos = nMax; } else { nEndPos = pageSize * pageCurrent; } nStartPos = nCurrent; //從元數據源復制記錄行 for (int i = nStartPos; i < nEndPos; i++) { dtTemp.ImportRow(srcTable.Rows[i]); nCurrent++; } textEdit1.Text = pageCurrent.ToString(); Page.Text = string.Format("/{0}頁", pageCount); } catch (Exception ex) { MessageBox.Show(ex.Message + "LoadPageData"); } return dtTemp; } private void ChangeDataSoure(DataTable table) { if (table == null) return; gridView1.Columns.Clear(); gridControl1.DataSource = null; gridControl1.DataSource = table; }