您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C# Winform实现数据分页显示

时间:2021-02-25 11:23:52  来源:  作者:

1、功能需求

本实例将通过c# winform实现简单的分页功能,需要的基础知识有SQL语句,c#语言基础以及c# winform的一些简单知识。

2、界面设计

这是一个简单的分页查询的界面,可以输入任意字段进行查询,这四个字段在数据准备会提到,整体界面如图1所示。

C# Winform实现数据分页显示

图1

中间显示是一个DataGridView,编辑好列和id,SortMode选择Automatic,意思是所有列自动铺满DataGridView,如图2所示。

C# Winform实现数据分页显示

图2

3、数据准备

本实例涉及到删查改,因此要有数据表以及对数据表进行操作的代码。数据库表非常简单,如图3所示,分别有对应四个字段。

C# Winform实现数据分页显示

图3

later_back模型类对应数据库操作类代码如下:

using MySQL.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.windows.Forms;
using WindowsFormsApp1.Bean;
namespace WindowsFormsApp1.SqlHelper
{
class LaterBackHelper
{
public LaterBackHelper(){}
public void insert(LaterBack laterBack)
{
string sql = "insert into later_back(dormitory_id,student_no,time,reason) values('" + laterBack.Dormitory_id + "','" + laterBack.Student_no + "'," + "'" + laterBack.Time + "',"
+ "'" + laterBack.Reason + "')";
try
{
int iRet = SqlHelperBase.ExecuteSql(sql);
if (iRet > 0)
{
MessageBox.Show("新增成功", "系统提示");
}
else
{
MessageBox.Show("新增失败", "系统提示");
}
}
catch (Exception)
{
throw;
}
}
public int update(LaterBack laterBack)
{
string sql = "update later_back set reason='" + laterBack.Reason + "' where student_no= '" + laterBack.Student_no + "' and"
+ " time = '" + laterBack.Time + "' and " + " dormitory_id= '" + laterBack.Dormitory_id + "'";
try
{
int iRet = SqlHelperBase.ExecuteSql(sql);//这里返回的是受影响的行数,为int值。可以根据返回的值进行判断是否插入成功。
if (iRet > 0)
{
MessageBox.Show("修改成功", "系统提示");
}
else
{
MessageBox.Show("修改失败", "系统提示");
}
return iRet;
}
catch (Exception)
{
throw;
}
}
public int delete(LaterBack laterBack)
{
string sql = "delete from later_back where dormitory_id='" + laterBack.Dormitory_id + "' and" + " student_no= '" + laterBack.Student_no + "' and"
+ " time = '" + laterBack.Time + "' and" + " reason= '" + laterBack.Reason+"'";
try
{
int iRet = SqlHelperBase.ExecuteSql(sql);//这里返回的是受影响的行数,为int值。可以根据返回的值进行判断是否插入成功。
if (iRet > 0)
{
MessageBox.Show("删除成功", "系统提示");
}
else
{
MessageBox.Show("删除失败", "系统提示");
}
return iRet;
}
catch (Exception)
{
throw;
}
}
public List<LaterBack> getAllLaterBacks()
{
List<LaterBack> laterBacks= new List<LaterBack>();
string sql = "select * from later_back";
MySqlDataReader mySqlDataReader = SqlHelperBase.ExecuteReader(sql);
while (mySqlDataReader.Read())
{
LaterBack laterBack = new LaterBack(int.Parse(mySqlDataReader[0].ToString()), int.Parse(mySqlDataReader[1].ToString()), mySqlDataReader[2].ToString(),
mySqlDataReader[3].ToString());
laterBacks.Add(laterBack);
}
mySqlDataReader.Close();
return laterBacks;
}
public List<LaterBack> getAllLaterBacks(int student_no)
{
List<LaterBack> laterBacks= new List<LaterBack>();
string sql = "select * from later_back where student_no ='" + student_no + "'";
MySqlDataReader mySqlDataReader = SqlHelperBase.ExecuteReader(sql);
while (mySqlDataReader.Read())
{
LaterBack laterBack = new LaterBack(int.Parse(mySqlDataReader[0].ToString()), int.Parse(mySqlDataReader[1].ToString()), mySqlDataReader[2].ToString(),
mySqlDataReader[3].ToString());
laterBacks.Add(laterBack);
}
mySqlDataReader.Close();
return laterBacks;
}
public DataSet getAllDataSet()
{
string sql = "select * from later_back";
return SqlHelperBase.GetDataSet(sql);
}
//模糊查询
public DataSet getDataSet(LaterBack laterBack)
{
string sql="";
if(laterBack.Student_no != -1)
{
if (laterBack.Dormitory_id != -1) sql = "select * from later_back where dormitory_id like '%" + laterBack.Dormitory_id
+ "%' and student_no like '%" + laterBack.Student_no + "%' and time like '%" + laterBack.Time
+ "%' and reason like '%" + laterBack.Reason + "%'";
else sql = "select * from later_back where student_no like '%" + laterBack.Student_no + "%' and time like '%" + laterBack.Time
+ "%' and reason like '%" + laterBack.Reason + "%'";
}
else
{
if (laterBack.Dormitory_id != -1) sql = "select * from later_back where dormitory_id like '%" + laterBack.Dormitory_id
+ "%' and time like '%" + laterBack.Time+ "%' and reason like '%" + laterBack.Reason + "%'";
else sql = "select * from later_back where time like '%" + laterBack.Time
+ "%' and reason like '%" + laterBack.Reason + "%'";
}
return SqlHelperBase.GetDataSet(sql);
}
}
}

4、源码实现

实现分页时,我的思想是,在每次查询时得到一个dataset1,然后在分页时根据一个from_index和一个end_index去得到当前页面要显示的dataset2,用dataset2来刷新当前要显示的数据,然后在dataset2里头支持行数据的修改与删除,可能从这么写不大合适,但是能完成分页的功能,仅供参考。源码如下:

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp1.Bean;
using WindowsFormsApp1.CacheUtil;
using WindowsFormsApp1.SqlHelper;
namespace WindowsFormsApp1
{
public partial class StudentLateBackPanelRightSelect : Form
{
private LaterBackHelper laterBackHelper;
private string []page_counts = { "5","6","7","8","9","10","15","20"};
private int total_page, page_step, current_page_index, total_count;
private DataSet dataSet;
public StudentLateBackPanelRightSelect()
{
laterBackHelper = new LaterBackHelper();
dataSet = laterBackHelper.getAllDataSet();
total_count = dataSet.Tables[0].Rows.Count;
page_step = 5;
total_page = Convert.ToInt16(Math.Ceiling(Convert.ToDouble(total_count) / page_step));
InitializeComponent();

initView(GetViewDataSet(dataSet,1,5));
comboBox_page_count.Items.AddRange(page_counts);
comboBox_page_count.SelectedIndex = 0;
label_all_item_count.Text = total_count.ToString();
label_page_count.Text = total_page.ToString();
}
//每次点击时刷新全局数据
private void initDataPage(int total_count,int page_step, int current_page_index)
{
this.total_count = total_count;
this.page_step = page_step;
this.total_page = Convert.ToInt16(Math.Ceiling(Convert.ToDouble(total_count) / page_step));
this.current_page_index = current_page_index;
}
//初始化界面并加载数据
private void initView(DataSet ds)
{
dataGridView.AutoGenerateColumns = false;
dataGridView.DataSource = ds.Tables[0];
this.dataGridView.Columns["dor_id"].DataPropertyName = ds.Tables[0].Columns[0].ToString();
this.dataGridView.Columns["stu_id"].DataPropertyName = ds.Tables[0].Columns[1].ToString();
this.dataGridView.Columns["time"].DataPropertyName = ds.Tables[0].Columns[2].ToString();
this.dataGridView.Columns["reason"].DataPropertyName = ds.Tables[0].Columns[3].ToString();
}

private void button_select_Click(object sender, EventArgs e)
{
string stu_id = textBox_stu_id.Text, dor_id = textBox_dor_id.Text, time = textBox_time.Text, reason = textBox_reason.Text;
if(stu_id.Equals("")&& dor_id.Equals("") && time.Equals("") && reason.Equals(""))
{
return;
}
if (dor_id.Equals("")) dor_id = "-1";
if (stu_id.Equals("")) stu_id = "-1";
LaterBack laterBack = new LaterBack(int.Parse(dor_id), int.Parse(stu_id), time, reason);
dataSet.Clear();
dataSet = laterBackHelper.getDataSet(laterBack);
initDataPage(dataSet.Tables[0].Rows.Count, page_step, 1);
initView(GetViewDataSet(dataSet, 1, page_step));
label_page_count.Text = total_page.ToString();
label_page_range.Text = "1-" + page_step.ToString();
label_all_item_count.Text = total_count.ToString();
}
//只能输入数字
private void only_num_press(object sender, KeyPressEventArgs e)
{
if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)8)
{
e.Handled = true;
}
}
//对行数据进行删除或修改操作
private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
string action = dataGridView.Columns[e.ColumnIndex].Name;//操作类型
var cells = dataGridView.Rows[e.RowIndex].Cells;
LaterBack laterBack = new LaterBack(int.Parse(cells[0].Value.ToString()), int.Parse(cells[1].Value.ToString()), cells[2].Value.ToString(), cells[3].Value.ToString());
switch (action)
{
case "update":
//获取相应列的数据ID,弹出加载了该ID数据详细信息的Form,用以修改
StudentLateBackPanelRightUpdate studentLateBackPanelRightUpdate = new StudentLateBackPanelRightUpdate(laterBack);
studentLateBackPanelRightUpdate.Show();
break;
case "delete":
if (MessageBox.Show("确定删除这行数据吗?", "删除提示", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
//获取相应列的数据ID,删除此数据记录
int result = laterBackHelper.delete(laterBack);
if(result > 0)
{
//dataSet.Clear();
dataSet = laterBackHelper.getAllDataSet();
initDataPage(dataSet.Tables[0].Rows.Count,page_step,1);
initView(GetViewDataSet(dataSet,1,page_step));
label_page_count.Text = total_page.ToString();
label_page_range.Text = "1-" + page_step.ToString();
label_all_item_count.Text = total_count.ToString();
}
}
break;
default:
break;
}
}
//获取要显示的数据源
public DataSet GetViewDataSet(DataSet a_ds,int from_index,int end_index)
{
//首先先声明一个DataSet对象和一个DataTable对象
DataSet l_ds = new DataSet();
DataTable l_dt = new DataTable();
//构建DataTable对象的列值
l_dt.Columns.Add("dor_id");//这些列名就是返回的DataSet的列名,可以随意添加
l_dt.Columns.Add("stu_id");
l_dt.Columns.Add("time");
l_dt.Columns.Add("reason");

//遍历传进来的DataSet的值,并对DataTable进行赋值操作
for (int i = from_index - 1; i < end_index ; i++)
{
DataRow dr = l_dt.NewRow();//首先新增一行,然后对其进行赋值
dr["dor_id"] = a_ds.Tables[0].Rows[i][0].ToString().Trim();
dr["stu_id"] = a_ds.Tables[0].Rows[i][1].ToString().Trim();
dr["time"] = a_ds.Tables[0].Rows[i][2].ToString().Trim();
dr["reason"] = a_ds.Tables[0].Rows[i][3].ToString().Trim();

l_dt.Rows.Add(dr);//这里一定要add进去
}
l_ds.Tables.Add(l_dt);//这里也不能忘记
return l_ds;
}
//combobox更改触发事件
private void combobox_selected_listen(object sender, EventArgs e)
{
page_step = int.Parse(comboBox_page_count.SelectedItem.ToString());
textBox_page_count.Text = 1.ToString();
label_page_range.Text = "1-" + page_step.ToString();
total_page = Convert.ToInt16( Math.Ceiling(Convert.ToDouble(total_count) / page_step));
label_page_count.Text = total_page.ToString();
initView(GetViewDataSet(dataSet, 1, page_step));
}
//输入页数变化
private void page_count_change(object sender, EventArgs e)
{
if (textBox_page_count.Text.Equals("")) return;
if (int.Parse(textBox_page_count.Text) < 1)
{
MessageBox.Show("输入页数不能小于1", "系统提示");
return;
}
if (int.Parse(textBox_page_count.Text) > total_page)
{
MessageBox.Show("输入页数超过总页数", "系统提示");
return;
}
current_page_index = int.Parse(textBox_page_count.Text);
var view_range = (current_page_index - 1)* page_step ;
if (view_range + page_step < total_count) {
initView(GetViewDataSet(dataSet, view_range + 1, view_range + page_step));
label_page_range.Text = (view_range + 1).ToString() + "-" + (view_range + page_step).ToString();
}
else {
initView(GetViewDataSet(dataSet, view_range + 1, total_count));
label_page_range.Text = (view_range + 1).ToString() + "-" + total_count.ToString();
}
}
private void button_first_page_Click(object sender, EventArgs e)
{
current_page_index = 1;
var view_range = (current_page_index - 1) * page_step;
initView(GetViewDataSet(dataSet, view_range + 1, view_range + page_step));
label_page_range.Text = (view_range + 1).ToString() + "-" + page_step.ToString();
textBox_page_count.Text = current_page_index.ToString();
}
private void button_previous_page_Click(object sender, EventArgs e)
{
if (current_page_index == 1) return;
current_page_index -= 1;
var view_range = (current_page_index - 1) * page_step;
initView(GetViewDataSet(dataSet, view_range + 1, view_range + page_step));
label_page_range.Text = (view_range + 1).ToString() + "-" + (view_range + page_step).ToString();
textBox_page_count.Text = current_page_index.ToString();
}
private void button_next_page_Click(object sender, EventArgs e)
{
if (current_page_index == total_page) return;
current_page_index += 1;
var view_range = (current_page_index - 1) * page_step;
if (view_range + page_step < total_count)
{
initView(GetViewDataSet(dataSet, view_range + 1, view_range + page_step));
label_page_range.Text = (view_range + 1).ToString() + "-" + (view_range + page_step).ToString();
}
else
{
initView(GetViewDataSet(dataSet, view_range + 1, total_count));
label_page_range.Text = (view_range + 1).ToString() + "-" + total_count.ToString();
}
textBox_page_count.Text = current_page_index.ToString();
}
private void button_last_page_Click(object sender, EventArgs e)
{
current_page_index = total_page;
var view_range = (current_page_index - 1) * page_step;
initView(GetViewDataSet(dataSet, view_range + 1, total_count));
label_page_range.Text = (view_range + 1).ToString() + "-" + total_count.ToString();
textBox_page_count.Text = current_page_index.ToString();
}
}
}

5、结果

程序运行结果如图4和图5所示,更改每页条数,或者输入页数时都能跳转到相应页面,所有功能都正常,至此,简单的分页功能就实现,如果有任何问题,欢迎给我留言。

C# Winform实现数据分页显示

图4


C# Winform实现数据分页显示

图5



Tags:C#   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  Tags: C#  点击:(1)  评论:(0)  加入收藏
C# 获取网络路径文件大小信息的方法private void button1_Click(object sender, EventArgs e){label2.Text= GetInfo(textBox1.Text);}private string GetInfo(string URL){...【详细内容】
2021-10-29  Tags: C#  点击:(52)  评论:(0)  加入收藏
现如今二维码广泛应用,已经成为了生活中不可或缺的东西;所以我们日常的开发中,也少不了对二维码的生成或者解析。此文讲述一下使用C# 生成和解析二维码 实现功能:将字符串生成二...【详细内容】
2021-10-21  Tags: C#  点击:(58)  评论:(0)  加入收藏
最近想自己做个录屏工具玩玩,使用的是ffmpeg,录屏是没有问题,在取麦克风及电脑声卡遇到了难题,ffmpeg也可以获取到设备名称但是没办法解析 ( 指令:ffmpeg -list_devices true -f d...【详细内容】
2021-08-04  Tags: C#  点击:(276)  评论:(0)  加入收藏
在实际的项目开发中,可能需要考虑代码的安全性或执行效率,需要将具体的功能实现隐藏,dll接口提供了很好的解决方案。dll接口不仅在C++的项目中可以直接调用,在C#开发的项目也同...【详细内容】
2021-07-09  Tags: C#  点击:(122)  评论:(0)  加入收藏
我是笑林新记,分享一下我使用C#的一些用法,希望对大家有帮助!欢迎关注:笑林新记Visual Studio版本:Enterprise 2015.net Framework版本:3.51Socket介绍 有粉丝私信说让讲一下局域...【详细内容】
2021-06-28  Tags: C#  点击:(159)  评论:(0)  加入收藏
开发工具:vs 2017AI 平台:http://ai.baidu.com/准备工作1、注册百度账号2、登录百度 AI 开发平台,http://ai.baidu.com/3、在控制台点击“百度语音”服务,点击“创建应用”,填写...【详细内容】
2021-06-10  Tags: C#  点击:(182)  评论:(0)  加入收藏
前言本来因为懒不想写这篇文章,但是不少人表示有兴趣,于是最后决定还是写一下。.NET 6 最近几个预览版一直都在开发体验(如 hot reload、linker 等)、平台支持(如 Android、iOS...【详细内容】
2021-06-07  Tags: C#  点击:(187)  评论:(0)  加入收藏
1、功能需求本实例将通过c# winform实现简单的分页功能,需要的基础知识有SQL语句,c#语言基础以及c# winform的一些简单知识。2、界面设计这是一个简单的分页查询的界面,可以输...【详细内容】
2021-02-25  Tags: C#  点击:(208)  评论:(0)  加入收藏
在你的 .NET 程序中经常会记录一些日志或者错误,为了实现这个功能,你可能会使用市面上那些现成的日志框架(log4net,nlog ...),当然你也可以设计并开发一个自己的日志框架,在这篇文...【详细内容】
2020-12-22  Tags: C#  点击:(203)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(1)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(10)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(16)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(46)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(46)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(37)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条