C# winform 自制分页功能
一个精简的分页类配合现有的界面按钮使用分页类Pagination.csusingSystem;usingSystem.Collections.Generic;/// summary/// 分页管理类/// /summarypublicclassPagination{privateint_pageIndex1;// 当前页码privateint_pageSize10;// 每页显示条数privateint_totalCount0;// 总记录数privateint_totalPages0;// 总页数/// summary/// 页码改变事件在UI中订阅此事件来刷新数据/// /summarypubliceventActionOnPageChanged;/// summary/// 当前页码从1开始/// /summarypublicintPageIndex{get{return_pageIndex;}set{if(value1value_totalPages){_pageIndexvalue;OnPageChanged?.Invoke();}}}/// summary/// 每页显示条数/// /summarypublicintPageSize{get{return_pageSize;}set{if(value0){_pageSizevalue;// 改变每页条数后重置到第一页_pageIndex1;// 重新计算总页数RecalculateTotalPages();OnPageChanged?.Invoke();}}}/// summary/// 总记录数/// /summarypublicintTotalCount{get{return_totalCount;}set{_totalCountvalue;RecalculateTotalPages();}}/// summary/// 总页数/// /summarypublicintTotalPages_totalPages;/// summary/// 是否有上一页/// /summarypublicboolHasPrevPage_pageIndex1;/// summary/// 是否有下一页/// /summarypublicboolHasNextPage_pageIndex_totalPages;/// summary/// 数据起始索引用于SQL查询的 OFFSET从0开始/// /summarypublicintStartIndex(_pageIndex-1)*_pageSize;/// summary/// 重新计算总页数/// /summaryprivatevoidRecalculateTotalPages(){if(_totalCount0){_totalPages1;}else{_totalPages(int)Math.Ceiling((double)_totalCount/_pageSize);}// 如果当前页超出总页数调整到最后一页if(_pageIndex_totalPages){_pageIndex_totalPages;}}/// summary/// 上一页/// /summarypublicvoidPrevPage(){if(HasPrevPage){PageIndex--;}}/// summary/// 下一页/// /summarypublicvoidNextPage(){if(HasNextPage){PageIndex;}}/// summary/// 跳转到指定页/// /summary/// param namepageNumber页码从1开始/param/// returns是否跳转成功/returnspublicboolGoToPage(intpageNumber){if(pageNumber1pageNumber_totalPages){PageIndexpageNumber;returntrue;}returnfalse;}/// summary/// 获取分页信息文本用于显示在界面上/// /summarypublicstringGetPageInfoText(){return$第{_pageIndex}/{_totalPages}页共{_totalCount}条记录;}/// summary/// 获取按钮状态用于界面按钮的Enabled属性/// /summarypublic(boolcanPrev,boolcanNext)GetButtonStatus(){return(HasPrevPage,HasNextPage);}}使用示例在窗体中publicpartialclassMainForm:Form{privatePagination_pagination;privateDataTable_allData;// 全部数据publicMainForm(){InitializeComponent();InitPagination();LoadMockData();LoadPageData();}privatevoidInitPagination(){_paginationnewPagination();_pagination.PageSize10;// 设置每页条数_pagination.OnPageChanged(){// 页码改变时重新加载数据LoadPageData();UpdateUI();};}privatevoidUpdateUI(){// 更新按钮状态var(canPrev,canNext)_pagination.GetButtonStatus();btnPrev.EnabledcanPrev;btnNext.EnabledcanNext;// 更新显示信息lblPageInfo.Text_pagination.GetPageInfoText();}// 按钮事件privatevoidbtnPrev_Click(objectsender,EventArgse){_pagination.PrevPage();}privatevoidbtnNext_Click(objectsender,EventArgse){_pagination.NextPage();}// 跳转按钮privatevoidbtnJump_Click(objectsender,EventArgse){if(int.TryParse(txtJumpPage.Text,outintpage)){if(!_pagination.GoToPage(page)){MessageBox.Show($页码范围1-{_pagination.TotalPages});}}else{MessageBox.Show(请输入有效的页码);}}// 设置每页条数privatevoidcmbPageSize_SelectedIndexChanged(objectsender,EventArgse){if(cmbPageSize.SelectedItem!null){intpageSizeConvert.ToInt32(cmbPageSize.SelectedItem);_pagination.PageSizepageSize;}}// 加载分页数据privatevoidLoadPageData(){// 方法1从内存数据中取varpageData_allData.Rows.CastDataRow().Skip(_pagination.StartIndex).Take(_pagination.PageSize).CopyToDataTable();dataGridView1.DataSourcepageData;// 方法2从数据库查询推荐// string sql // SELECT * FROM Users// ORDER BY ID// OFFSET Offset ROWS// FETCH NEXT PageSize ROWS ONLY;//// var parameters new// {// Offset _pagination.StartIndex,// PageSize _pagination.PageSize// };// dataGridView1.DataSource ExecuteQuery(sql, parameters);}privatevoidLoadMockData(){// 模拟155条数据_allDatanewDataTable();_allData.Columns.Add(ID,typeof(int));_allData.Columns.Add(Name,typeof(string));for(inti1;i155;i){_allData.Rows.Add(i,$用户{i});}// 设置总记录数_pagination.TotalCount_allData.Rows.Count;}}核心属性说明属性说明PageIndex当前页码从1开始PageSize每页条数TotalCount总记录数外部赋值TotalPages总页数自动计算HasPrevPage是否有上一页HasNextPage是否有下一页StartIndex数据起始索引从0开始用于SQL的OFFSET使用步骤实例化分页类_pagination new Pagination();订阅事件_pagination.OnPageChanged LoadData;设置总记录数_pagination.TotalCount totalRows;按钮事件调用_pagination.PrevPage()/NextPage()/GoToPage()获取数据使用StartIndex和PageSize查询数据库更新UI根据HasPrevPage/HasNextPage控制按钮启用状态这个分页类不包含任何UI控件完全独立你只需要在窗体的按钮事件中调用对应方法即可。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2522563.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!