news 2026/8/26 17:33:40

Winform/Sunny.UI的DataGridView数据展示、uiPagination分页

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Winform/Sunny.UI的DataGridView数据展示、uiPagination分页

一:准备

1:数据库

CREATE DATABASE lwq; --创建数据库 USE lwq; --使用数据库 --创建表 CREATE TABLE diviceinfo ( id INT IDENTITY(1,1) NOT NULL, -- 主键 diviceName NVARCHAR(100) NOT NULL, -- 设备名称 status TINYINT NOT NULL, -- 设备状态(0:运行,1=故障,2:待机,3:维修中) location NVARCHAR(200) NULL, -- 设置位置 manufacturer NVARCHAR(100) NULL, -- 制造商 purchaseDate DATETIME NULL, -- 购买日期 diviceTypeId INT NOT NULL, -- 设备类型Id CONSTRAINT PK_diviceinfo PRIMARY KEY CLUSTERED (id) );

2:框架

搭建框架:MODEL、DAL、BLL、UI,如图。右键解决方案,点击添加新建项目,选择类库命名为MODEL、DAL、BLL,然后右键解决方案,点击添加新建项目,选择Windows窗体应用,命名为UI。

3:控件

3.1:安装依赖包

右键点击UI选择NuGet包,安装Sunny.UI包;

3.2:控件布局

在UI里面自带的Form1里面选择控件,uiDataGridView(数据展示)、uiPagination(分页控件)。

点击uiDataGridView控件右上角的三角形。1.选择添加列,并且设置页眉文本为数据库对应的列名(这只是一个文本展示,随意取,但是为了方便辨认,使用与数据库字段对应的列名:编号、名称、状态、位置、厂商、日期、类型);2.选择编辑列,将所有列的DataPropertyName改为对应英文(同理随意,但是需要与后面的model属性相同)。

二:Model

在MODEL里面添加类:

namespace MODEL { public class DiviceInfoMODEL { public int ID { get; set; } public string diviceName { get; set; } public int status { get; set; } public string location { get; set; } public string manufacturer { get; set; } public DateTime purchaseDate { get; set; } public int diviceTypeId { get; set; } } }

三:DAL

在DAL里面添加类:里面需要进行两个方法的编写:获取所有数据、获取所有数据数量

using MODEL; using UTIL; namespace DAL { public class DiviceInfoDAL { //获取数据 public List<DiviceInfoMODEL> GetDiviceInfo(int Page,int PageSize ) { DAO d = new DAO(); try { List<DiviceInfoMODEL> diviceInfoMODELs = new List<DiviceInfoMODEL>(); string sql = $"select * from diviceinfo order by ID offset {(Page - 1) * PageSize} rows fetch next {PageSize} rows only"; SqlDataReader r = d.query(sql); while (r.Read()) { diviceInfoMODELs.Add(new DiviceInfoMODEL { //一定判断是否存在数据库内容为null:DBnull ID = r[0] == DBNull.Value ? 0 : Convert.ToInt32(r[0]), diviceName = r[1] == DBNull.Value ? "" : r[1].ToString(), status = r[2] == DBNull.Value ? 0 : Convert.ToInt32(r[2]), location = r[3] == DBNull.Value ? "没有" : r[3].ToString(), manufacturer = r[4] == DBNull.Value ? "没有" : r[4].ToString(), purchaseDate = r[5] == DBNull.Value ? DateTime.Now : Convert.ToDateTime(r[5]), diviceTypeId = r[6] == DBNull.Value ? 0 : Convert.ToInt32(r[6]) }); } return diviceInfoMODELs; } catch (Exception e) { Console.WriteLine(e.Message); return new List<DiviceInfoMODEL>(); } finally { d.close(); } } //获取总数 public int GetDiviceCount() { DAO d = new DAO(); try { string sql = "select count(*) from diviceinfo"; SqlDataReader r = d.query(sql); if (r.Read()) { return Convert.ToInt32(r[0]); } return 0; } catch (Exception e) { Console.WriteLine(e.Message); return 0; } finally { d.close(); } } } }

四:BLL

在BLL里面添加类:里面也有两个方法对应DAL:

using DAL; using MODEL; using UTIL; namespace BLL { public class DiviceInfoBLL { private DiviceInfoDAL divicedal = new DiviceInfoDAL(); //获取数据 public List<DiviceInfoMODEL> GetDiviceInfo(int Page, int PageSize) { return divicedal.GetDiviceInfo(Page, PageSize); } //获取总数 public int GetDiviceCount() { return divicedal.GetDiviceCount(); } } }

五:UI

双击Form1.cs设计的uiPagination控件,进入UI界面代码编写:

using BLL; using MODEL; using Sunny.UI; namespace UI { public partial class Form1 : UIForm { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } //在设计页面属性选择事件,选择shown(表示页面加载完成后执行) private void Form1_Shown(object sender, EventArgs e) { GetDiviceInfo(); } //获取diviceinfo所有消息 private DiviceInfoBLL divicebll = new DiviceInfoBLL(); private int Page = 1; private int PageSize = 3; private int Total = 0; public void GetDiviceInfo() { List<DiviceInfoMODEL> d = divicebll.GetDiviceInfo(Page, PageSize); Total = divicebll.GetDiviceCount(); uiDataGridView1.AutoGenerateColumns = false;//确保不会自动生成列名 uiPagination1.PageSize = PageSize;//初始化分页控件的每页数量 uiPagination1.TotalCount = Total;//初始化分页控件的总数 //页数等于总数除每页数量,所以不需要初始化 uiDataGridView1.DataSource = null;//首先清空数据,防止刷新导致数据堆积 uiDataGridView1.DataSource = d;//加入数据 } private void uiPagination1_PageChanged(object sender, object pagingSource, int pageIndex, int count) { int newpage = uiPagination1.ActivePage; Page = newpage; GetDiviceInfo(); } } }

六:易错点

1.MODEL的属性与uidatagridview的列属性:datapropettyname不一致,导致数据无法映射;

2.uidatagridview没禁止自动添加列,导致列翻倍。(uiDataGridView1.AutoGenerateColumns = false)

3.没有初始化分页控件,导致虽然数据成功展示,但是显示了总共有50页数据。

4.DAl里面应该判断数据是否等于DBNULL.VALUE,然后使用三元运算符进行数据选择,否者会导致数据没有添加;

5.每个类库、windows窗体应用间互相引用时(using MODEL...),需要右键项目的引用,点击添加引用,选择需要的项目。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 17:31:53

转:怎样招到优秀的核心人才

个人理解&#xff1a; 薪资越高不代表岗位吸引力就越强 每个人都喜欢钱 工作更具吸引力比单纯改进某个流程更有意义 创造与竞争对手等量的员工价值 能带来可预见性结果的方式来降低员工愿意接受的最低薪酬 薪酬低于行业水平的公司&#xff0c;怎样招到同样优秀的核心人才&…

作者头像 李华
网站建设 2026/8/26 17:29:53

Raid卡命名及代表含义

一 RAID-LSI-9560-LP-8i-4GB Raid卡表示含义RAID-LSI-9560-LP-8i-4GB 是 Broadcom&#xff08;原 LSI&#xff09;MegaRAID 系列企业级 SAS/NVMe 阵列卡的完整型号标识&#xff0c;各段含义如下&#xff1a;‌RAID‌&#xff1a;功能类型&#xff0c;指硬件 RAID 控制器&#x…

作者头像 李华
网站建设 2026/8/26 17:26:08

C++进阶知识5.0

目录 伪唤醒与竞态条件 ☆☆☆TLS技术&#xff08;内存池一级缓冲区的使用&#xff09; 常用的输入接口 防火墙(多机器协作) 伪唤醒与竞态条件 我&#xff1a; 请解释一下你实现的线程池中&#xff0c;HandlerTask 函数内部为什么使用 while 循环来检查任务队列是否为空&a…

作者头像 李华
网站建设 2026/8/26 17:19:58

深圳EMC现场测试辐射传导测试

电子产品想要顺利流通市场&#xff0c;稳定可靠的电磁兼容性能是必不可少的一环。坐落于深 圳宝安沙井的深圳市中鉴检测&#xff08;CCTITEST&#xff09;&#xff0c;配备完善专业EMC实验室&#xff0c;提供全套 EMI、EMS电磁兼容检测&#xff0c;为各类电子电器产品扫清电磁干…

作者头像 李华
网站建设 2026/8/26 17:11:14

scrapy爬取动态页面的正确姿势

不能否认, 它是相当出色的爬虫框架, 其借用的是相似的办法去爬取网页, 即所爬取的是静态页面, 然而实际情形是, 多数网站均为动态的, 我们所见到的正常页面皆是经浏览器渲染后的成果, 倘若径直运用爬取网页的方式, 极有可能无法获取到预期的数据。一种看似理所当然的办法, 便是…

作者头像 李华