C# 分页实现


通用分页的设计与实现

一、分页数据查询的原理分析

二、分页类的设计分析

总原则:提取不变的,封装变化的;不变的作为方法体,变化的作为参数

【变化的】
1.每页显示的条数

2.显示的字段(属性)

3.表的名称

4.查询条件

5.过滤的条件(主键或唯一键)

6.过滤的条数==================(需要计算的)

7.当前显示的页码

8.排序条件

9.记录总数===================(查询的结果返回)

10.显示的总页数================(查询结果返回后进一步运算得到)

【不变的】
查询语句的核心结构

【编写分页查询方法】

该查询方法不需要直接的参数传递,参数获取全部通过属性。
 

sql实例:


use DataPagerDB
go
--查询第一页
select  Top 5 StudentId,StudentName,Gender,Birthday,PhoneNumber from Students
where Birthday>'1989/10/12' 
--查询第二页
select  Top 5 StudentId,StudentName,Gender,Birthday,PhoneNumber from Students
where Birthday>'1989/10/12'  and StudentId not in
(select Top 5 StudentId from Students where Birthday>'1989/10/12' order by StudentId ASC )
order by StudentId ASC
--查询第三页    总结过滤条数=每页显示的条数*(显示的第几页-1)
select  Top 5 StudentId,StudentName,Gender,Birthday,PhoneNumber from Students
where Birthday>'1989/10/12'  and StudentId not in
(select Top 10 StudentId from Students where Birthday>'1989/10/12' order by StudentId ASC )
order by StudentId ASC
--查询符合条件的记录总数
select COUNT(*) from Students where Birthday>'1989/10/12' 

--计算符合条件的总页数(比如总计5条,每页分别显示:3、5、8,计算实际分页数)
print '----相除----'
print 5/3     --2页
print 5/5     --1页
print 5/8     --1页

print '---实际分页数---'
print 5/3+1     --2页
print 5/5         --1页
print 5/8+1     --1页

--对于除不尽的情况,通过取模来判断(有余数的都加1,就是实际页数)
print '---取模---'
print 5%3    
print 5%5        
print 5%8    
--==============分页实现的基本思路=================
--每页显示的条数
--过滤掉的总数=每页显示的条数*(当前显示的页数-1)
--查询条件的确定
--排序条件

--获取满足条件的记录总数
--知道查询结果需要显示的页数=记录总数/每页显示条数 + 1(如果记录总数和每页显示条数取模后不为0,则加1)

分页类设计:

 public class SqlDataPager
    {
        #region 一般属性

        /// <summary>
        /// 每页显示的条数
        /// </summary>
        public int PageSize { get; set; }
        /// <summary>
        /// 需要显示的字段(以逗号分隔 )
        /// </summary>
        public string FiledName { get; set; }
        /// <summary>
        /// 表的名称
        /// </summary>
        public string TableName { get; set; }
        /// <summary>
        /// 查询条件
        /// </summary>
        public string Condition { get; set; }
        /// <summary>
        /// 表的主键或唯一键
        /// </summary>
        public string PrimaryKey { get; set; }
        /// <summary>
        /// 当前页码
        /// </summary>
        public int CurrentPage { get; set; }
        /// <summary>
        /// 排序条件
        /// </summary>
        public string Sort { get; set; }

        #endregion

        #region 只读属性

        /// <summary>
        /// 记录的总数【不能直接赋值】
        /// </summary>
        //  public int RecordCount { get; set; }//此中手设计不安全
        private int recordCount;
        public int RecordCount//设置只读属性,外面不能直接赋值
        {
            get { return recordCount; }
        }
        /// <summary>
        /// 总页数
        /// </summary>
        public int TotalPages
        {
            get
            {
                if (recordCount != 0)//如果查询记录总数不为0
                {
                    if (recordCount % PageSize != 0)
                    {
                        return recordCount / PageSize + 1;
                    }
                    else
                    {
                        return recordCount / PageSize;
                    }
                }
                else
                {
                    this.CurrentPage = 1;//如果查询没有数据,则当前页码需要复位
                    return 0;
                }
            }
        }
        #endregion

        //分页查询方法所用的SQL语句
        private string GetPagedSQL()
        {
            //计算需要过滤的总数
            string filterCount = (PageSize * (CurrentPage - 1)).ToString();
            //组合SQL语句
            string sql = "select  Top {0} {1} from {2}  where {3}  and {4} not in  ";
            sql += "(select Top {5}  {6} from {7} where {8} order by {9} ) order by {10};";
            sql += "select count(*) from {11} where {12}";
            sql = string.Format(sql, PageSize, FiledName, TableName, Condition,
                PrimaryKey, filterCount, PrimaryKey, TableName, Condition, Sort, Sort, TableName, Condition);
            return sql;
        }
        /// <summary>
        /// 执行分页查询,返回DataTable
        /// </summary>
        /// <returns></returns>
        public DataTable GetPagedData()
        {
            //【1】执行查询,返回分页后的结果集
            DataSet ds = SQLHelper.GetDataSet(GetPagedSQL());
            //【2】获取满足记录的总数
            this.recordCount = Convert.ToInt32(ds.Tables[1].Rows[0][0]);
            return ds.Tables[0];
        }


    }

调用示例:

public partial class FrmDataPager : Form
    {
        private SqlDataPager objPager = null;
        public FrmDataPager()
        {
            InitializeComponent();
            this.dtpBirthday.Text = "1988-1-1";

            //初始化数据分页对象
            objPager = new SqlDataPager()
            {
                PrimaryKey = "StudentId",//表的主键
                TableName = "Students",
                FiledName = "StudentId,StudentName,Gender,Birthday,PhoneNumber",
                CurrentPage = 1,
                Sort = "StudentId ASC"//排序条件
            };

            //设置默认的显示条数
            this.cboRecordList.SelectedIndex = 1;
            this.dgvStudentList.AutoGenerateColumns = false;

            //禁用相关按钮
            this.btnFirst.Enabled = false;
            this.btnNext.Enabled = false;
            this.btnPre.Enabled = false;
            this.btnLast.Enabled = false;
            this.btnToPage.Enabled = false;
        }
        //执行查询的公共方法
        private void Query()
        {
            //开启所有按钮
            this.btnFirst.Enabled = true;
            this.btnNext.Enabled = true;
            this.btnPre.Enabled = true;
            this.btnLast.Enabled = true;
            this.btnToPage.Enabled = true;

            //【1】设置分页查询的条件
            objPager.Condition = string.Format("Birthday>'{0}'", this.dtpBirthday.Text);
            //【2】设置每页显示的条数
            objPager.PageSize = Convert.ToInt32(this.cboRecordList.Text.Trim());
            //【3】执行查询
            this.dgvStudentList.DataSource = objPager.GetPagedData();
            //【4】显示记录总数、显示总页数、显示当前页码
            this.lblRecordsCount.Text =objPager.RecordCount.ToString ();
            this.lblPageCount.Text = objPager.TotalPages.ToString();
            if (this.lblPageCount.Text == "0")
            {
                this.lblCurrentPage.Text = "0";
            }
            else
            {
                this.lblCurrentPage.Text = objPager.CurrentPage.ToString();
            }

            //禁用按钮的情况
            if (this.lblPageCount.Text == "0" || this.lblPageCount.Text == "1")
            {
                this.btnFirst.Enabled = false;
                this.btnNext.Enabled = false;
                this.btnPre.Enabled = false;
                this.btnLast.Enabled = false;
                this.btnToPage.Enabled = false;
            }
            else
            {
                this.btnToPage.Enabled = true;
            }
        }


        //提交查询
        private void btnQuery_Click(object sender, EventArgs e)
        {
            objPager.CurrentPage = 1;//每次执行查询都要设置为第1页
            Query();
            this.btnPre.Enabled = false;
            this.btnFirst.Enabled = false;
        }
        //第1页
        private void btnFirst_Click(object sender, EventArgs e)
        {
            objPager.CurrentPage = 1;
            Query();
            this.btnPre.Enabled = false;
            this.btnFirst.Enabled = false;
           // btnQuery_Click(null, null);//可以直接调用上面的事件
        }
        //下一页
        private void btnNext_Click(object sender, EventArgs e)
        {
            objPager.CurrentPage += 1;
            Query();
            //当执行到最后一页的时候应该禁用最后一页和下一页的按钮
            if (objPager.CurrentPage == objPager.TotalPages)
            {
                this.btnNext.Enabled = false;
                this.btnLast.Enabled = false;
            }
        }
        //上一页
        private void btnPre_Click(object sender, EventArgs e)
        {
            objPager.CurrentPage -= 1;
            Query();
            if (objPager.CurrentPage == 1)
            {
                this.btnPre.Enabled = false;
                this.btnFirst.Enabled = false;
            }
        }
        //最后一页
        private void btnLast_Click(object sender, EventArgs e)
        {
            objPager.CurrentPage = objPager.TotalPages;
            Query();
            this.btnNext.Enabled = false;
            this.btnLast.Enabled = false;
        }
        //跳转到
        private void btnToPage_Click(object sender, EventArgs e)
        {
            if (this.txtToPage.Text.Trim().Length == 0)
            {
                MessageBox.Show("请输入要跳转的页码!","信息提示");
                this.txtToPage.Focus();
                return;
            }
            //使用正则表达式验证必须为大于0的正整数...
            int toPage = Convert.ToInt32(this.txtToPage.Text.Trim());
            if (toPage > objPager.TotalPages)
            {
                MessageBox.Show("跳转的页数不能大于数据总页数!","信息提示");
                this.txtToPage.Focus();
                this.txtToPage.SelectAll();
                return;
            }
            //开始跳转页数
            objPager.CurrentPage = toPage;
            Query();
            if (objPager.CurrentPage == 1)
            {
                this.btnPre.Enabled = false;
                this.btnFirst.Enabled = false;
            }
            else if (objPager.CurrentPage == objPager.TotalPages)
            {
                this.btnNext.Enabled = false;
                this.btnLast.Enabled = false;
            }
        }
        //关闭窗口
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现DataGridView分页可以通过以下步骤来完成: 1. 从数据库中获取数据并存储在数据集或数据表中。 2. 将数据表绑定到DataGridView控件上。 3. 设置DataGridView控件的分页属性,例如每页显示的记录数、当前页数和总页数。 4. 根据当前页数和每页显示的记录数,筛选出当前页需要显示的记录,并重新绑定到DataGridView控件上。 下面是一个简单的C#代码示例: ```csharp private void BindDataGridView(int currentPage) { int pageSize = 10; // 每页显示的记录数 int totalRecord = GetTotalRecord(); // 获取总记录数 int totalPages = (int)Math.Ceiling(totalRecord / (double)pageSize); // 计算总页数 DataTable dt = GetData(currentPage, pageSize); // 从数据库中获取当前页的数据 dgv.DataSource = dt; // 将数据表绑定到DataGridView控件上 lblCurrentPage.Text = currentPage.ToString(); // 显示当前页数 lblTotalPages.Text = totalPages.ToString(); // 显示总页数 } private void btnFirst_Click(object sender, EventArgs e) { BindDataGridView(1); // 显示第一页的数据 } private void btnPrevious_Click(object sender, EventArgs e) { int currentPage = int.Parse(lblCurrentPage.Text); if (currentPage > 1) { BindDataGridView(currentPage - 1); // 显示上一页的数据 } } private void btnNext_Click(object sender, EventArgs e) { int currentPage = int.Parse(lblCurrentPage.Text); int totalPages = int.Parse(lblTotalPages.Text); if (currentPage < totalPages) { BindDataGridView(currentPage + 1); // 显示下一页的数据 } } private void btnLast_Click(object sender, EventArgs e) { int totalPages = int.Parse(lblTotalPages.Text); BindDataGridView(totalPages); // 显示最后一页的数据 } ``` 在上述代码中,BindDataGridView方法用于从数据库中获取数据并绑定到DataGridView控件上,btnFirst、btnPrevious、btnNext和btnLast按钮的Click事件分别用于显示第一页、上一页、下一页和最后一页的数据。由于分页属性的设置与具体的DataGridView控件实现有关,因此在此不再赘述。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值