DataGridView分页功能的实现
using Microsoft.Reporting.WinForms;
using System;
using System.Data;
using System.Windows.Forms;
namespace DataGridView分页
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ShowData();
}
ReportViewer reportViewer = new ReportViewer();//创建报表
int num = 0;
int y = 1;
Page page = new Page();//定义一个具有分页功能的类
DataSet PaginationSet = new DataSet();//定义一个存储数据的集合
DataTable pageTable = new DataTable();//定义一个数据表
//开始
private void ShowData()
{
DataSet PageSet = new DataSet();//定义一个存储数据的集合
string sql = "select BookName,BookAuthor from Book";
PageSet.Clear();//清空数据集中原有的内容
PageSet = SqlHelper.SqlHelper.GetDataSet(sql);
FillDataTable(sql, ref PageSet);//向数据表中填充数据
page.ItemsPerPage = 5;//设定每页显示多少行
page.SetDataSet(PageSet, out pageTable);//设置当前数据集中的内容
display(pageTable);//显示数据
timer1.Enabled = true;//启动翻页计时器
}
//从数据库获取数据
public bool FillDataTable(string sql, ref DataSet TargetDataSet)
{
try
{
TargetDataSet = SqlHelper.SqlHelper.GetDataSet(sql);
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return false;
}
}
//显示数据
private void display(DataTable dataTable)
{
//=============显示在reportViewer报表中=====================================
reportViewer.ProcessingMode = ProcessingMode.Local;//设置本地处理模式
reportViewer.Dock = DockStyle.Fill;//设置报表控件填满窗体
this.groupBox2.Controls.Add(reportViewer);//填加报表控件到窗体
reportViewer.LocalReport.DataSources.Clear();//清空报表数据
reportViewer.LocalReport.ReportEmbeddedResource = "DataGridView分页.Report1.rdlc";//设置rdlc文件,ReportEmbeddedResource(嵌入式模式)
//reportViewer1.LocalReport.ReportPath = "Book.Report1.rdlc";
reportViewer.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", dataTable));//DataSet1是设计报表时指定的数据集名称
// reportViewer.Drillthrough += new DrillthroughEventHandler(DemoDrillthroughEventHandler);//添加钻取事件
reportViewer.LocalReport.Refresh();
reportViewer.RefreshReport();//刷新报表,这句一定要有
//===========显示在DataGridView控件中=============================================
//if (dataTable != null)//当数据表中存在记录时
//{
// ListData.Rows.Clear();//清空DataGridView中原有数据
// object[] item = new object[dataTable.Columns.Count];//定义一个object类的数组
// for (int i = 0; i < dataTable.Rows.Count; i++)//循环数据表中每一行数据
// {
// for (int j = 0; j < dataTable.Columns.Count; j++)//循环数据表中每一列数据
// {
// item[j] = dataTable.Rows[i][j];//保存数据表中的内容
// }
// ListData.Rows.Add(item);//向DataGridView中填加数据
// }
//}
}
//首页
private void FistPage_Click(object sender, EventArgs e)
{
pageTable = null;//清空表中原有数据
page.GoToFirtPage(out pageTable);//跳转到首页
display(pageTable);//显示数据
}
//上一页
private void PreviousPage_Click(object sender, EventArgs e)
{
pageTable = null;//清空表中原有数据
page.GoToPreviousPage(out pageTable);//跳转到上一页
display(pageTable);//显示数据
}
//下一页
private void NextPage_Click(object sender, EventArgs e)
{
pageTable = null;//清空表中原有数据
page.GoToNextPage(out pageTable);//跳转到下一页
display(pageTable);//显示数据
}
//尾页
private void LastPage_Click(object sender, EventArgs e)
{
pageTable = null;//清空表中原有数据
page.GotoLastPage(out pageTable);//跳转到尾页
display(pageTable);//显示数据
}
//翻页计时器
private void timer1_Tick(object sender, EventArgs e)
{
num++;
if (num == 2)
{
if (y == page.AllPages)
{
y = 1;
NextPage.PerformClick();//执行下一页按钮点击动作
num = 0;
ShowData();
}
else
{
NextPage.PerformClick();//执行下一页按钮点击动作
num = 0;
y++;
}
}
}
}
}
///自定义page类
using System.Data;
namespace DataGridView分页
{
public class Page
{
private int RowsPerPage = 5;//表示RowPerPage属性的默认值
private DataSet TempSet = new DataSet();//定义一个存储数据的对像
private int CurrentPage = 0;//表示当前处于第1页
public int ItemsPerPage
{
get
{
return RowsPerPage;//返回当前页显示多少条数据
}
set
{
RowsPerPage = value;//设置当前页显示的数据数目
}
}
public void SetDataSet(DataSet dataSet, out DataTable dataTable)
{
TempSet = dataSet;//向数据集中填充内容
GoToPageNumber(1, out dataTable);//跳转到第1页
}
public void GotoLastPage(out DataTable pageTable)
{
GoToPageNumber(GetTotalPages(), out pageTable);//跳转到最后1页
}
public void GoToNextPage(out DataTable pageTable)
{
GoToPageNumber(CurrentPage + 1, out pageTable);//跳转到当前页的下一页
}
public void GoToFirtPage(out DataTable pageTable)
{
pageTable = null;//清空数据表中pageTable记录
DataSet TempSubSet = new DataSet();//初始化一个存储数据的数据集
DataRow[] Rows = new DataRow[RowsPerPage];//声明一个DataRow数组
//如果数据集中的记录总数不足一行则在第1行中显示
if (TempSet.Tables[0].Rows.Count < RowsPerPage && CurrentPage != 1)
{
Rows = new DataRow[TempSet.Tables[0].Rows.Count];//重新定义DataRow数组的长度
for (int i = 0; i < TempSet.Tables[0].Rows.Count; i++)//循环数据集中的每一条记录
{
Rows[i] = TempSet.Tables[0].Rows[i];//为DataRow数组赋值
}
TempSubSet.Merge(Rows);//将当前的数据记录填加进数据集
pageTable = TempSubSet.Tables[0];//设定当前数据表的内容
}
//当数据集中的记录大于每页显示记录时
if (TempSet.Tables[0].Rows.Count >= RowsPerPage && CurrentPage != 1)
{
for (int i = 0; i < RowsPerPage; i++)//循环每页显示的数据数
{
Rows[i] = TempSet.Tables[0].Rows[i];//为DataRow数组赋值
}
TempSubSet.Merge(Rows);//将当前的数据记录填加进数据集
pageTable = TempSubSet.Tables[0];//设定当前数据表的内容
}
CurrentPage = 1;//设定当前处于第1页
}
public void GoToPreviousPage(out DataTable pageTable)
{
if (CurrentPage != 1)//当当前页没有处于第一页时
{
GoToPageNumber(CurrentPage - 1, out pageTable);//返回当前页的上一页
}
else//当处于第1页时
{
pageTable = null;//清空数据表中的内容
}
}
public void GoToPageNumber(int n, out DataTable pageTable)
{
DataSet TempSubSet = new DataSet();//初始化一个数据集对象
DataRow[] Rows = new DataRow[RowsPerPage];//定义一个存储数据行的数组
int AllPages = 0;//该变量表示所有页数
AllPages = GetTotalPages();//为AllPages赋值
if ((n > 0) && (n <= AllPages))//当变量n处于有效值范围内时
{
int PageIndex = (n - 1) * RowsPerPage;//设置页索引的值
if (PageIndex >= TempSet.Tables[0].Rows.Count)//当页索引的值大于等于数据集中的所有记录总数时
{
GoToFirtPage(out pageTable);//返回到第1页
}
else//当页索引的值小于数据集中的所有记录总数时
{
//记录当前数据集按指定的分页方式分为多少页
int WholePages = TempSet.Tables[0].Rows.Count / RowsPerPage;
//当变量n为总页数且有些页的数据不足时
if ((TempSet.Tables[0].Rows.Count % RowsPerPage) != 0 && n == AllPages)
{
//表示不足一页的记录数
Rows = new DataRow[TempSet.Tables[0].Rows.Count - (WholePages * RowsPerPage)];
}
//循环数据集中的每一条记录
for (int i = 0, j = PageIndex; i < Rows.Length && j < TempSet.Tables[0].Rows.Count; j++, i++)
{
Rows[i] = TempSet.Tables[0].Rows[j];//为数组Rows赋值
}
TempSubSet.Merge(Rows);//将不足一页的数据附加到数据集中
CurrentPage = n;//设定当前处于第几页
pageTable = TempSubSet.Tables[0];//为pageTable赋值
}
}
else// 当变量n处于无效数据范围内时
{
pageTable = null;//清空数据表中的内容
}
}
public int GetTotalPages()
{
//当数据表中的行数除于每页显示的行数的余数不为0时
if ((TempSet.Tables[0].Rows.Count % RowsPerPage) != 0)
{
//记录数据表中的所有行数除以每页显示的数据数
int x = TempSet.Tables[0].Rows.Count / RowsPerPage;
return (x + 1);//返回该数据集所包含的所有页数
}
else//当数据表中的行数刚好能整除每页显示的页数时
{
return TempSet.Tables[0].Rows.Count / RowsPerPage;//返回两者相除后的值
}
}
}
}