BERTopic主题相似度分析:从入门到精通的完整指南
2026/4/16 8:37:33
一个精简的分页类,配合现有的界面按钮使用:
usingSystem;usingSystem.Collections.Generic;/// <summary>/// 分页管理类/// </summary>publicclassPagination{privateint_pageIndex=1;// 当前页码privateint_pageSize=10;// 每页显示条数privateint_totalCount=0;// 总记录数privateint_totalPages=0;// 总页数/// <summary>/// 页码改变事件(在UI中订阅此事件来刷新数据)/// </summary>publiceventActionOnPageChanged;/// <summary>/// 当前页码(从1开始)/// </summary>publicintPageIndex{get{return_pageIndex;}set{if(value>=1&&value<=_totalPages){_pageIndex=value;OnPageChanged?.Invoke();}}}/// <summary>/// 每页显示条数/// </summary>publicintPageSize{get{return_pageSize;}set{if(value>0){_pageSize=value;// 改变每页条数后重置到第一页_pageIndex=1;// 重新计算总页数RecalculateTotalPages();OnPageChanged?.Invoke();}}}/// <summary>/// 总记录数/// </summary>publicintTotalCount{get{return_totalCount;}set{_totalCount=value;RecalculateTotalPages();}}/// <summary>/// 总页数/// </summary>publicintTotalPages=>_totalPages;/// <summary>/// 是否有上一页/// </summary>publicboolHasPrevPage=>_pageIndex>1;/// <summary>/// 是否有下一页/// </summary>publicboolHasNextPage=>_pageIndex<_totalPages;/// <summary>/// 数据起始索引(用于SQL查询的 OFFSET,从0开始)/// </summary>publicintStartIndex=>(_pageIndex-1)*_pageSize;/// <summary>/// 重新计算总页数/// </summary>privatevoidRecalculateTotalPages(){if(_totalCount==0){_totalPages=1;}else{_totalPages=(int)Math.Ceiling((double)_totalCount/_pageSize);}// 如果当前页超出总页数,调整到最后一页if(_pageIndex>_totalPages){_pageIndex=_totalPages;}}/// <summary>/// 上一页/// </summary>publicvoidPrevPage(){if(HasPrevPage){PageIndex--;}}/// <summary>/// 下一页/// </summary>publicvoidNextPage(){if(HasNextPage){PageIndex++;}}/// <summary>/// 跳转到指定页/// </summary>/// <param name="pageNumber">页码(从1开始)</param>/// <returns>是否跳转成功</returns>publicboolGoToPage(intpageNumber){if(pageNumber>=1&&pageNumber<=_totalPages){PageIndex=pageNumber;returntrue;}returnfalse;}/// <summary>/// 获取分页信息文本(用于显示在界面上)/// </summary>publicstringGetPageInfoText(){return$"第{_pageIndex}/{_totalPages}页,共{_totalCount}条记录";}/// <summary>/// 获取按钮状态(用于界面按钮的Enabled属性)/// </summary>public(boolcanPrev,boolcanNext)GetButtonStatus(){return(HasPrevPage,HasNextPage);}}publicpartialclassMainForm:Form{privatePagination_pagination;privateDataTable_allData;// 全部数据publicMainForm(){InitializeComponent();InitPagination();LoadMockData();LoadPageData();}privatevoidInitPagination(){_pagination=newPagination();_pagination.PageSize=10;// 设置每页条数_pagination.OnPageChanged+=()=>{// 页码改变时重新加载数据LoadPageData();UpdateUI();};}privatevoidUpdateUI(){// 更新按钮状态var(canPrev,canNext)=_pagination.GetButtonStatus();btnPrev.Enabled=canPrev;btnNext.Enabled=canNext;// 更新显示信息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){intpageSize=Convert.ToInt32(cmbPageSize.SelectedItem);_pagination.PageSize=pageSize;}}// 加载分页数据privatevoidLoadPageData(){// 方法1:从内存数据中取varpageData=_allData.Rows.Cast<DataRow>().Skip(_pagination.StartIndex).Take(_pagination.PageSize).CopyToDataTable();dataGridView1.DataSource=pageData;// 方法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条数据_allData=newDataTable();_allData.Columns.Add("ID",typeof(int));_allData.Columns.Add("Name",typeof(string));for(inti=1;i<=155;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查询数据库HasPrevPage/HasNextPage控制按钮启用状态这个分页类不包含任何UI控件,完全独立,你只需要在窗体的按钮事件中调用对应方法即可。