当前位置: 首页 > news >正文

窗体应用分页查询

窗体应用(WinForm)分页查询

适用场景:WinForm 客户端数据库数据展示、DataGridView 表格分页查询、批量数据加载优化
核心目的:避免一次性加载海量数据导致窗体卡顿、内存溢出,实现按需分页加载数据,提升客户端流畅度
**

一、分页核心原理

**
窗体分页查询本质是 数据库端分页(核心)。客户端传递分页参数给数据库,数据库只返回当前页数据,最大限度减少数据传输和内存占用。

  1. 必备分页参数
  • 页码(PageIndex):当前展示的页数,默认从 1 开始
  • 页容量(PageSize):每页展示的数据条数,常用 10、20、50
  • 总条数(TotalCount):符合查询条件的所有数据总数,用于计算总页数
  • 总页数(TotalPage):根据总条数和页容量计算得出
  1. 核心计算公式
    总页数 = 总条数 % 页容量 == 0 ? 总条数 / 页容量 : 总条数 / 页容量 + 1
    数据偏移量(SQL 跳过条数)= (页码 - 1) * 页容量

**

二、SQL 分页查询语句(SQL Server)

**
1. 基础分页语句:
– 分页查询数据
SELECT * FROM 数据表名
WHERE 筛选条件
ORDER BY 主键/排序字段 – 分页必须排序,否则数据会错乱
OFFSET (@PageIndex-1)@PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
– 查询符合条件的总数据条数(用于计算分页)
SELECT COUNT(
) FROM 数据表名 WHERE 筛选条件;

  1. 语句说明
  • OFFSET:跳过指定条数的数据
  • FETCH NEXT … ROWS ONLY:读取指定条数的数据
  • 必须加 ORDER BY:数据库默认无序,不加排序会导致每页数据重复、错乱

三、通用分页实体类

// 当前页数据集合
public List DataList { get; set; } = new List();

// 符合条件的数据总条数
public int TotalCount { get; set; }

// 计算后的总页数
public int TotalPage { get; set; }

///
/// 当前页码
///
public int PageIndex { get; set; }

// 每页展示条数
public int PageSize { get; set; }

// 统一计算总页数
public void ComputeTotalPage()
{
if (PageSize <= 0)
{
TotalPage = 0;
return;
}
TotalPage = (int)Math.Ceiling(TotalCount / (double)PageSize);
}
public class PageQueryParam
{
// 默认第一页
public int PageIndex { get; set; } = 1;
// 项目统一默认每页10条
public int PageSize { get; set; } = 10;

// 计算跳过数据数
public int GetSkip()
{
return (PageIndex - 1) * PageSize;
}
}

四、核心分页查询业务

封装通用分页查询方法,传入 SQL、分页参数,直接返回分页结果,适配所有数据表。
/// 对应数据库实体
/// 条件语句,不带ORDER BY、不带分页
/// 排序语句(必填,例如:ORDER BY Id DESC)
/// 分页参数
/// SQL防注入参数
/// 分页结果实体
public PageResult GetPageList(string whereSql, string orderBySql, PageQueryParam pageParam, params SqlParameter[] sqlParams) where T : new()
{
PageResult pageResult = new PageResult();
pageResult.PageIndex = pageParam.PageIndex;
pageResult.PageSize = pageParam.PageSize;

// 1. 拼接统计总条数SQL
string countSql = $“SELECT COUNT(*) FROM 表名 WHERE 1=1 {whereSql}”;
int totalCount = Convert.ToInt32(SqlHelper.ExecuteScalar(countSql, sqlParams));
pageResult.TotalCount = totalCount;
pageResult.ComputeTotalPage();

// 无数据直接返回空
if (totalCount == 0)
return pageResult;

// 2. 拼接分页查询SQL(项目固定OFFSET FETCH写法)
string dataSql = $@“SELECT * FROM T_UserInfo
WHERE 1=1 {whereSql}
{orderBySql}
OFFSET @Skip ROWS
FETCH NEXT @PageSize ROWS ONLY”;

// 3. 新增分页参数
var paramList = sqlParams.ToList();
paramList.Add(new SqlParameter(“@Skip”, pageParam.GetSkip()));
paramList.Add(new SqlParameter(“@PageSize”, pageParam.PageSize));

// 4. 查询并绑定数据
pageResult.DataList = SqlHelper.QueryBySql(dataSql, paramList.ToArray());
return pageResult;

五、窗体前端分页控件交互逻辑

窗体界面常用:上一页、下一页、首页、末页、页码输入、每页条数选择 功能
1. 窗体全局分页变量
// 分页入参实例
private PageQueryParam _pageParam = new PageQueryParam();
// 分页结果实例
private PageResult _pageResult = new PageResult();

// 页面搜索条件
private string _searchKey = string.Empty;
2. 核心加载数据方法
///
/// 本周项目通用加载分页数据方法
/// 包含模糊查询、条件筛选、分页绑定、界面刷新全套逻辑
/// 所有分页页面直接调用该方法即可
///
private void LoadDataByPage()
{
try
{
// 1. 初始化条件拼接
string where = string.Empty;
List paramList = new List();

// 模糊查询条件
if (!string.IsNullOrEmpty(_searchKey))
{
where += " AND UserName LIKE @SearchKey OR Phone LIKE @SearchKey";
paramList.Add(new SqlParameter(“@SearchKey”, $“%{_searchKey}%”));
}

// 固定筛选:只查询未删除数据
where += " AND IsDelete = 0";

// 2. 调用通用分页方法
_pageResult = GetPageList(where, “ORDER BY CreateTime DESC, Id DESC”, _pageParam, paramList.ToArray());

// 3. 绑定DataGridView
dgv_Data.AutoGenerateColumns = false;
dgv_Data.DataSource = null;
dgv_Data.DataSource = _pageResult.DataList;

// 4. 刷新分页状态栏文本
lblPageTip.Text =KaTeX parse error: Expected 'EOF', got '}' at position 91: …TotalPage} 页"; }̲ } catch (Excep…“数据加载失败:{ex.Message}”, “系统提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
}

3. 分页按钮点击事件
// 首页
private void btnFirst_Click(object sender, EventArgs e)
{
_pageParam.PageIndex = 1;
LoadDataByPage();
}

// 上一页
private void btnPrev_Click(object sender, EventArgs e)
{
if (_pageParam.PageIndex > 1)
{
_pageParam.PageIndex–;
LoadDataByPage();
}
}

// 下一页
private void btnNext_Click(object sender, EventArgs e)
{
if (_pageParam.PageIndex < _pageResult.TotalPage)
{
_pageParam.PageIndex++;
LoadDataByPage();
}
}

// 末页
private void btnLast_Click(object sender, EventArgs e)
{
_pageParam.PageIndex = _pageResult.TotalPage;
LoadDataByPage();
}

// 搜索按钮点击事件
private void btnSearch_Click(object sender, EventArgs e)
{
// 搜索重置为第一页
_pageParam.PageIndex = 1;
_searchKey = txtSearch.Text.Trim();
LoadDataByPage();
}

// 重置按钮
private void btnReset_Click(object sender, EventArgs e)
{
txtSearch.Clear();
_searchKey = string.Empty;
_pageParam.PageIndex = 1;
LoadDataByPage();
}
六、常见问题与踩坑记录

  1. 分页数据重复/错乱
    原因:未添加 ORDER BY 排序,数据库分页依赖有序数据集。
    解决:分页 SQL 必须添加稳定排序(主键、时间戳)。
  2. 切换页码数据不刷新
    原因:DataGridView 数据源未清空,缓存残留旧数据。
    解决:绑定新数据前先设置DataSource = null。
  3. 总页数计算错误
    原因:未对取余结果判断,直接整除。
    解决:使用笔记中封装的CalcTotalPage 方法自动计算。
  4. 页码越界报错
    解决:切换页码前判断,当前页码不能小于1、不能大于总页数。
http://www.jsqmd.com/news/1230079/

相关文章:

  • 计算机毕业设计之基于springboot车库泊车管理系统
  • 可以提取人声的音频工具有哪些?2026大马工具箱AI人声分离实测 - 工具测试专家
  • SAP-ABAP:ALV跨版本兼容指南——适配ECC与S4 HANA系统的ALV开发注意事项
  • 运动过度与长期卧床的健康风险及科学恢复指南
  • 二本物联网工程好就业吗?普通本科学生怎么找工作
  • IPv6家庭网络部署与配置全指南
  • 2026有实力的工业烤箱厂家推荐:泽润机械等源头工厂技术解析 - 变量人生001
  • Incident-Response-Powershell代码实现原理:PowerShell事件日志收集机制深度解析
  • 第一次接入本体语义,业务域怎么选 —— 设备、订单、客户的选型逻辑
  • 【小程序毕业设计】基于微信小程序的智能健康生活服务平台 日常运动饮食打卡健康助手小程序设计 轻量化个人健康作息管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • ppt转pdf怎么操作哪个好,免费在线桌面小程序实测盘点 - 免费软件工具方法教程
  • 游戏引擎渲染管线与物理模拟系统
  • 计算机小程序毕设实战-基于微信小程序的图书馆自习座位管理平台 高校图书馆座位预约与签到小程序的设计与实现 轻量化图书馆自习资源预约服务小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • SpringBoot+Vue家政平台毕业设计:从CRUD到准生产级架构实战
  • 如何让经典GTA游戏在现代电脑上完美运行:SilentPatch完整修复指南
  • 2026杭州GEO优化服务商观察:从AI可见性到认知资产五家本地服务商的能力图谱 - 优企甄选
  • GraphRAG 别急着上:先把图谱血缘理清,比调大模型重要十倍
  • 宁波黄金折价时各种名目的扣费项目多到根本数不过来 - 大牌深度测评
  • Replication Manager告警系统:邮件、Slack、Teams通知配置终极指南
  • 3个关键决策:为什么otel-desktop-viewer成为本地可观测性开发的颠覆者
  • LiveUI 3.0:打造现代化React组件库的终极解决方案
  • 2026年7月最新南京苹果售后热线及客户服务网点地址核验查询 - 品牌资讯服务
  • 2026中式糕点生产厂家推荐:非遗药食同源代表性品牌解析 - 全域品牌推荐
  • 游戏引擎集成NanoVG:突破传统UI限制的矢量图形绘制方案
  • 2026武汉黄陂妹子换包首选易奢福,本地口碑相当炸裂 - 易奢福
  • dotnet-core-uninstall完全教程:10个技巧帮你清理系统.NET Core安装
  • 计算机小程序毕设实战-面向大众的日常健康管理服务小程序的设计与实现 个人健康数据记录与生活作息管理小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • k8s-sidecar源码解析:理解Python实现的Kubernetes配置同步器内部机制
  • ·认识python
  • 百度网盘秒传链接提取:告别重复上传的终极解决方案