C# winform分页查询的实现示例

1、功能需求

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

2、界面设计

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

图1

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

图2

3、数据准备

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

图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所示,更改每页条数,或者输入页数时都能跳转到相应页面,所有功能都正常,至此,简单的分页功能就实现,如果有任何问题,欢迎给我留言。

图4

图5

到此这篇关于C# winform分页查询的实现示例的文章就介绍到这了,更多相关C# winform分页查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#在winform中实现数据增删改查等功能

    winform中利用ado.net实现对单表的增删改查的详细例子,具体如下: 1.前言: 运行环境:VS2013+SQL2008+Windows10 程序界面预览: 使用的主要控件:dataGridview和menuStrip等.  2.功能具体介绍: 1.首先,我们要先实现基本的数据操作,增删改查这几个操作. (1)先定义一个数据库操作的公共类: using System; using System.Collections.Generic; using System.Linq; using S

  • C#中WinForm程序退出方法技巧总结

    本文实例总结了C#中WinForm程序退出方法技巧.分享给大家供大家参考.具体分析如下: 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environment.Exit(0); 等他们各自的方法不一样,下面我们就来详细介绍一下. 1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退

  • C# Winform中实现主窗口打开登录窗口关闭的方法

    在使用C#进行Winform编程时,我们经常需要使用一个登录框来进行登录,一旦输入的用户名密码登录成功,这时登录窗口应该关闭,而且同时打开主程序窗口.该如何来实现呢? 乍一想,很简单啊,打开主窗口就用主窗口的Show()方法,而关闭登录窗口就用登录窗口的Close()方法即可.即代码如下: Program.cs中代码: 复制代码 代码如下: Application.Run(new FormLogin()); 登录窗口(FormLogin)代码: 复制代码 代码如下: private void b

  • C# WinForm开发中使用XML配置文件实例

    本文介绍在使用C#开发WinForm程序时,如何使用自定义的XML配置文件.虽然也可以使用app.config,但命名方面很别扭. 我们在使用C#开发软件程序时,经常需要使用配置文件.虽然说Visual Studio里面也自带了app.config这个种配置文件,但用过的朋友都知道,在编译之后,这个app.config的名称会变成app.程序文件名.config,这多别扭啊!我们还是来自己定义一个配置文件吧. 配置文件就是用来保存一些数据的,那用xml再合适不过.那本文就介绍如何使用XML来作为

  • C#数据导入/导出Excel文件及winForm导出Execl总结

    一.asp.net中导出Execl的方法: 在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器.在Response输出时,\t分隔的数据,导出execl时,等价于分列,\n等价于换行. 1.将整个html全部输出execl 此法将html中所有的内容,如按钮,表格,图片等全部输出到Execl中. 复制代码 代码如下: Response.Clear(); Response.Buffer= t

  • c# winform多线程的小例子

    在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果.因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口将出现假死.为了有更好的用户体验,程序启动一个新的线程来单独执行该计算,然后每隔200毫秒读取一次累加结果,并把结果显示到文本框下方的label控件中.同时,程序支持取消操作,点击取消累计按钮,程序将取消累加操作,并把当前累加值显示到label中.为了方便后面的描述,我把UI线程称作主线程,把执行累加计算的线程称作工作者线程.该过程有两个关键点: 1:如何在

  • C# WinForm中禁止改变窗口大小的方法

    本文介绍在使用C#开发WinForm窗体程序时,如何设置窗体的大小不能被改变. 我们在开发一个窗体(WinForm)程序时,所有的控件都部署在程序界面上了,如果这时来把窗体的大小调整一下,那界面就难看了.怎么设置窗体大小不能被修改呢? 在Form类下面有一个FormBorderStyle的字段,我们可以通过设置它的值来让窗体不能被拉大拉小.FormBorderStyle的值设置为FormBorderStyle.FixedSingle或Fixed3D时,窗体大小是不能被改变的. 当然,还有一种情况

  • C# winform分页查询的实现示例

    1.功能需求 本实例将通过c# winform实现简单的分页功能,需要的基础知识有SQL语句,c#语言基础以及c# winform的一些简单知识. 2.界面设计 这是一个简单的分页查询的界面,可以输入任意字段进行查询,这四个字段在数据准备会提到,整体界面如图1所示. 图1 中间显示是一个DataGridView,编辑好列和id,SortMode选择Automatic,意思是所有列自动铺满DataGridView,如图2所示. 图2 3.数据准备 本实例涉及到删查改,因此要有数据表以及对数据表进行

  • mybatis-plus分页查询的实现示例

    按照官方文档进行的配置:快速开始|mybatis-plus 引入依赖: <!-- 引入mybatisPlus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <!--

  • MyBatis Plus 实现多表分页查询功能的示例代码

    在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的值 一.分页配置 可以直接使用selectPage这样的分页,但返回的数据确实是分页后的数据,但在控制台打印的SQL语句其实并没有真正的物理分页,而是通过缓存来获得全部数据中再进行的分页,这样对于大数据

  • MyBatis-Plus 分页查询的实现示例

    方法: 使用selectPage()方法,第一个参数是传入分页方法(传入当前页和当前显示多少条数据),第二个参数是传入查询条件(如果查询全部的话,可以传null). 前提: 表中的数据为: 第一种方式: //分页查询 Page<Employee> employees = employeeMapper.selectPage(new Page<>(3, 2), null); System.out.println("数据为:"+employees.getRecords

  • sqlserver2005利用临时表和@@RowCount提高分页查询存储过程性能示例分享

    最近发现现有框架的通用查询存储过程的性能慢,于是仔细研究了下代码: 复制代码 代码如下: Alter PROCEDURE [dbo].[AreaSelect]    @PageSize int=0,    @CurrentPage int=1,    @Identifier int=NULL,    @ParentId int=NULL,    @AreaLevel int=NULL,    @Children int=NULL,    @AreaName nvarchar(50)=NULL, 

  • PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)

    1.首先做主页面Ajax_pag.php 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Ajax做分页</title> <script src="bootstrap/js/jquery-1.11.2.min.js"></script> <script src="Ajax_

  • 利用PHP访问数据库_实现分页功能与多条件查询功能的示例

    1.实现分页功能 <body> <table width="100%" border="1"> <thead> <tr> <th>代号</th> <th>名称</th> <th>价格</th> </tr> </thead> <tbody> <?php require_once "./DBDA.cl

  • thinkPHP5框架实现分页查询功能的方法示例

    本文实例讲述了thinkPHP5框架实现分页查询功能的方法.分享给大家供大家参考,具体如下: controller文件内Admin.php <?php namespace app\admin\controller; use think\Controller; use app\admin\model\Admin as AdminModel; //使用分页类 取别名解决类名冲突 class Admin extends Controller{ public function lst(){ /* 分页开

  • 基于Mybatis Plus实现多表分页查询的示例代码

    注意:Mybatis Plus 3.0.7 版本才开始用[自定义sql]+[QueryWrapper],低版本不能使用,还是老实写SQL进行条件拼接 1.源码分析 在Wrapper<T>接口中就有如下方法 /** * 获取自定义SQL 简化自定义XML复杂情况 * 使用方法:自定义sql + ${ew.customSqlSegment} * 1.逻辑删除需要自己拼接条件 (之前自定义也同样) * 2.不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦) * 3.用法 ${e

  • springboot整合mybatis-plus实现多表分页查询的示例代码

    1.新建一个springboot工程 2.需要导入mybatis和mybatis-plus的依赖文件 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <dependency> &l

随机推荐