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;//返回两者相除后的值
        }
    }
}

}

posted @ 2020-02-25 18:47  zhujie-  阅读(594)  评论(0编辑  收藏  举报