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;
}
