效率分页代码

View Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
//Download by http://www.codefans.net
namespace PaginationFunction
{
    class page
    {
        private int RowsPerPage = 5;//表示ItemsPerPage属性的默认值
        private DataSet TempSet = new DataSet();//定义一个存储数据的对象
        private int CurrentPage = 0;//表示当前处于第一页
        /// <summary>
        /// 表示每页显示多少条记录
        /// </summary>
        public int ItemsPerPage
        {
           get
           {
              return RowsPerPage;//返回当前页显示的多少数据
           }
           set
           {
              RowsPerPage = value;//设置当前页显示的数据数目
           }
        }

        public void  SetDataSet(DataSet dataSet,out DataTable dataTable)
        {
            TempSet = dataSet;//向数据集中填充内容
            GoToPageNumber(1,out dataTable);//跳转到第一页
        }

        /// <summary>
        /// 跳转到最后一页
        /// </summary>
        #region GoToLastPage
        public void  GoToLastPage(out DataTable pageTable)
        {
            GoToPageNumber(GetTotalPages(),out pageTable);//跳转到最后一页
        }
        #endregion

        /// <summary>
        /// 显示当前页的下一页记录,如果该页不存在,则不做任何操作
        /// </summary>
        #region GoToNextPage
        public void  GoToNextPage(out DataTable pageTable)
        {
            GoToPageNumber(CurrentPage + 1,out pageTable);//跳转到当前页的下一页
        }
        #endregion

        /// <summary>
        /// Displays the first page.
        /// </summary>
        #region GoToFirstPage
        public void  GoToFirstPage(out DataTable pageTable )
        {
            pageTable = null;//清空数据表中pageTable的记录
            DataSet TempSubSet = new DataSet();//初始化一个存储数据的数据集
            DataRow[] Rows = new DataRow[RowsPerPage];//声明一个DataRow数组

            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页
          
        }
        #endregion

        /// <summary>
        /// 显示上一条记录
        /// </summary>
        #region GoToPreviousPage
        public void  GoToPreviousPage(out DataTable  pageTable )
        {

            if(CurrentPage != 1)//当当前页没有处于第1页时
            {
                GoToPageNumber(CurrentPage - 1,out pageTable);//返回当前页的上一页

            }
            else//当处于第1页时
            {
                pageTable = null;//清空数据表中的内容
            }
        }
        #endregion

        /// <summary>
        /// 跳转到某一页,如果该页不存在则什么也不做
        /// </summary>
        /// <param name="n">当前显示的页数</param>
        #region GoToPageNumber
        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)//当页索引的值大于等于数据集中的所有记录总数时
                {
                    GoToFirstPage(out pageTable);//返回到第一页
                }
                else//当页索引的值小于数据集中的所有记录总数时
                {
                    int WholePages = TempSet.Tables[0].Rows.Count / RowsPerPage;//记录当前数据集按指定的分页方式分为多少页
                    if((TempSet.Tables[0].Rows.Count % RowsPerPage) != 0 && n == AllPages)//当变量n为总页数且有些页的数据不足时
                    {
                        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;//清空数据表中的内容
            }
        }
        #endregion

        /// <summary>
        /// 该方法用来获取数据集分页后的页的总数
        /// </summary>
        /// <returns>返回当前数据集中按指定的显示方式所具有的页数 </returns>
        public int GetTotalPages()
        {
            if((TempSet.Tables[0].Rows.Count % RowsPerPage) != 0)//当数据表中的行数除以每页显示的行数的余数不为0时
            {
                int x = TempSet.Tables[0].Rows.Count / RowsPerPage;//记录数据表中的所有行数除以每页显示的数据数
                return (x + 1);//返回该数据集所包含的所有页数
            }
            else//当数据表中的行数刚好能正处每页显示的页数时
            {
                return TempSet.Tables[0].Rows.Count / RowsPerPage;//返回两者相除后的值
            }
        }
    }
}
View Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;//引用与数据库操作有关的命名空间

namespace PaginationFunction
{
    public partial class PaginationFunction : Form
    {
        public PaginationFunction()
        {
            InitializeComponent();
        }
        private static string ConnectString = "server=.;database=pubs;integrated security=sspi";//定义数据库连接字符串
        private SqlConnection PaginationConnection;//定义数据库连接对象
        private SqlDataAdapter PaginationAdapter;//定义填充数据集对象
        private DataSet PaginationSet = new DataSet();//定义存储数据的集合
        private DataTable PageTable = new DataTable();//定义一个数据表
        private page Page = new page();//定义一个具有分页功能的类

        private void PaginationFunction_Load(object sender, EventArgs e)
        {
            DataSet PageSet = new DataSet();// 定义一个存储数据的集合
            PaginationConnection = new SqlConnection(ConnectString);//初始化数据库连接对象
            string selectString = "select emp_id as 用户编号,fname as 用户姓名,hire_date as 工作时间 from employee";//定义一个查询字符串变量
            PageSet.Clear();//清空数据集中原有内容
            FillDataTable(selectString,ref PageSet);//型数据表中填充数据

            Page.ItemsPerPage = 8;//设定每页显示多少行
            Page.SetDataSet(PageSet,out PageTable);//设置当前数据集中的内容
            display(PageTable);//显示数据

        }

        public bool FillDataTable(string sqlStr,ref DataSet TargetDataSet)
        {
            try
            {
                PaginationConnection = new SqlConnection(ConnectString);//初始化数据库连接对象
                PaginationAdapter = new SqlDataAdapter(sqlStr,PaginationConnection);//初始化数据读取对象
                PaginationAdapter.Fill(TargetDataSet);//填充数据集
                return true;//返回值为true
            }
            catch(Exception ex)//捕获异常
            {
                MessageBox.Show(ex.Message);//显示异常信息
                return false;//返回值为false
            }
            finally
            {
                PaginationConnection.Close();//关闭数据库连接
            }
        }

        private void display(DataTable PageTable)
        {
            if(PageTable != null)//当数据表中存在记录时
            {
                ListData.Rows.Clear();//清空DataGridView中原有的数据
                object[] item = new object[PageTable.Columns.Count];//定义一个object类型的数组
                for(int i = 0; i < PageTable.Rows.Count; i++)//循环遍历数据表中的每一行数据
                {
                    for(int j = 0; j < PageTable.Columns.Count; j++)//循环遍历数据表中每一列数据
                    {
                        item[j] = PageTable.Rows[i][j];//保存数据表中的数据内容
                    }
                    ListData.Rows.Add(item);//向DataGridView中添加数据
                }
            }
        }

        private void fistpage_Click(object sender,EventArgs e)
        {
            PageTable = null;//清空数据表中原有内容
            Page.GoToFirstPage(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);//显示数据
        }
    }
}
posted @ 2012-10-17 08:53  尼姑哪里跑  阅读(145)  评论(0编辑  收藏  举报