C# 解决datagridview控件显示大量数据拖拉卡顿问题

article/2025/11/1 1:51:06

问题描述:

由于在使用SQL查询大量的数据并一次显示到dataGridView控件,出现拖拉的时候卡顿。
解决方法:
1.首先分页。
2.其次把显示控件设置双buffer。

解决过程如下:

1.设置dataGridView双buffer代码如下,需要引用反射命名空间

 Type dgvType = this.dataGridView1.GetType();PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);pi.SetValue(this.dataGridView1, true, null);

2.自己定义分页操作控件,上一页,下一页,首页,尾页,在加载form的时候添加事件。并为他们写一个操作事件

  private void Form1_Load(object sender, EventArgs e){this.btn_EndPage.Click += Ctrl_Click;this.btn_FirstPage.Click += Ctrl_Click;this.btn_LastPage.Click += Ctrl_Click;this.btn_NextPage.Click += Ctrl_Click;//this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);//this.UpdateStyles();}private void Ctrl_Click(object sender, EventArgs e){Button btn = (Button)sender;if (btn.Text == this.btn_EndPage.Text){if (currentPage == pageCount){ return; }currentPage = pageCount;LoadPage();}else if (btn.Text == this.btn_FirstPage.Text){if (currentPage == 1){ return; }currentPage = 1;LoadPage();}else if (btn.Text == this.btn_LastPage.Text){if (currentPage == 1){ return; }currentPage--;LoadPage();}else if (btn.Text == this.btn_NextPage.Text){if (currentPage == pageCount){ return; }currentPage++;LoadPage();}else{MessageBox.Show("error");}}

3.下面代码是分页方法,加载page

  #region datagridview sort/// <summary>/// 每页记录数/// </summary>private int pageSize = 50;/// <summary>/// 总记录数/// </summary>private int recordCount = 0;/// <summary>/// 总页数/// </summary>private int pageCount = 0;/// <summary>/// 当前页/// </summary>private int currentPage = 0;/// <summary>/// 分页的方法/// </summary>/// <param name="str"></param>private void PageSorter(){foreach (DataColumn col in dt.Columns){DataGridViewTextBoxColumn dgvc = new DataGridViewTextBoxColumn();dgvc.Name = "";dgvc.DataPropertyName = "";dgvc.HeaderText = col.ToString();dataGridView1.Columns.Add(dgvc);}recordCount = dt.Rows.Count;     //记录总行数pageCount = (recordCount / pageSize);if ((recordCount % pageSize) > 0){pageCount++;}//默认第一页currentPage = 1;LoadPage();//调用加载数据的方法}/// <summary>/// LoadPage方法/// </summary>private void LoadPage(){if (currentPage < 1) currentPage = 1;if (currentPage > pageCount) currentPage = pageCount;int beginRecord;    //开始指针int endRecord;      //结束指针DataTable dtTemp;dtTemp = dt.Clone();beginRecord = pageSize * (currentPage - 1);if (currentPage == 1) beginRecord = 0;endRecord = pageSize * currentPage;if (currentPage == pageCount) endRecord = recordCount;for (int i = beginRecord; i < endRecord; i++){dtTemp.ImportRow(dt.Rows[i]);}dataGridView1.Rows.Clear();this.lb_CurrentRow.Text = "当前页: " + currentPage.ToString() + " / " + pageCount.ToString();//当前页this.lb_TotalRows.Text = "总行数: " + recordCount.ToString() + " 行";//总记录数把临时table的数据插入到datagridview控件里面。for (int i = 0; i < dtTemp.Rows.Count; i++){dataGridView1.Rows.Add();for (int j = 0; j < dtTemp.Columns.Count; j++)dataGridView1.Rows[i].Cells[j].Value = dtTemp.Rows[i][j].ToString();}}#endregion

Tips:

文中的“dt”是datatable类型的数据,给位看官可以自己创建,也可以从数据库直接获取测试数据。


Extension1:

1.设置dataGridView自增序列号

 //填充序列号private void dataGridView1_RowPostPaint_1(object sender, DataGridViewRowPostPaintEventArgs e){Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,e.RowBounds.Location.Y,dataGridView1.RowHeadersWidth - 4,e.RowBounds.Height);TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),dataGridView1.RowHeadersDefaultCellStyle.Font,rectangle,dataGridView1.RowHeadersDefaultCellStyle.ForeColor,TextFormatFlags.VerticalCenter | TextFormatFlags.Right);}

Extension2:

1.设置dataGridView自增序列号

//用委托更新data,防止卡顿。private delegate void UpdateDataGridView(DataTable dt);private void UpdateGV(DataTable dt){if (dataGridView1.InvokeRequired){//这里没有看懂,有大神可以解释下嘛this.BeginInvoke(new UpdateDataGridView(UpdateGV), new object[] { dt });}else{dataGridView1.DataSource = dt;dataGridView1.Refresh();}}}

今天就写到这里,记录学习的一天。望各位看官互相学习交流
本文分页代码转自

在这里插入图片描述


http://chatgpt.dhexx.cn/article/THWqPTUp.shtml

相关文章

DataGridView绑定数据库

背景 今天在做C#实验的时候&#xff0c;遇到了一个难题&#xff1a;需要将数据库中的数据在C#的窗体的DataGridView控件中显示出来。当然老师布置这个作业是在之前做了铺垫的&#xff0c;之前做省县区三级查询时&#xff0c;讲过了SampleData和LiteDB的使用&#xff0c;但是我…

Winform实现在DataGridView控件的单元格中添加多个控件

Winform实现在DataGridView控件的单元格中添加多个控件 背景实现思路关键代码完整代码下载 背景 DataGridView控件的列是支持TextBoxColumn、ComboBoxColumn等类型的&#xff0c;就是DataGridView的单元格进入编辑模式的时候就会出现对应的控件&#xff0c;但是有些业务场景是…

C# datagridview 单行文字自动换行

dgv.DefaultCellStyle.WrapMode True dgv.RowTemplate.DefaultCellStyle.WrapMode True dgb.RowsDefaultCellStyle.WrapMode True dgv.AlternatingRowsDefaultCellStyle.WrapMode True 在设计界面里手动设置&#xff0c;一般情况下&#xff0c;设置其中一个WrapMode为true…

c#提高datagridview刷新速度(两种方法计时对比)

两种方法&#xff0c;代码如下&#xff1a; void initDataGridView(){Stopwatch sw new Stopwatch();//Stopwatch提供一组方法和属性&#xff0c;可用于准确地测量运行时间sw.Start();//方法一&#xff1a;一行一行增加到datagridview中for (int i 0; i < 10000; i){int R…

Winform中打印 dataGridView里的内容

最近评论问题比较多&#xff0c;这是几年前得代码了&#xff0c;今天正好有时间我重新整理了下代码把源码Demo发上来给大家看看互相学习。 有问题随时交流。没有积分得私信我发你。 Demo地址&#xff1a;DataGirdView打印.rar-C#文档类资源-CSDN下载 //调用GridPrinter首先添…

C# DataGridView 使用

1、//dataGridView標題居中 dataGridView2.ColumnHeadersDefaultCellStyle.Alignment DataGridViewContentAlignment.MiddleCenter;2、//dataGrideView文本居中 dataGridView2.RowsDefaultCellStyle.Alignment DataGridViewContentAlignment.MiddleCenter;3、//dataGridVie…

C#中DataGridView操作

DataGridView官方介绍 1.DataGridView增加数据 // 先清理&#xff0c;防止数据脏乱 skinDataGridView1.Rows.Clear(); // 获取最新行的索引 int index skinDataGridView1.Rows.Add(); // 添加数据 skinDataGridView1.Rows[index].Cells[0].Value "第index行第一列&quo…

C#Winform的DataGridView控件使用详解1—七种DataGridViewColumn类型使用方法

C#Winform的DataGridView控件使用详解1—七种DataGridViewColumn类型使用方法 DataGirdView控件Column类型DataGridViewButtonColumn列&#xff1a;按钮DataGridViewCheckBoxColumn列&#xff1a;复选框DataGridViewComboBoxColumn列&#xff1a;下拉框DataGridViewImageColumn…

DataGridView简单介绍

在很多软件中都需要查询数据&#xff0c;显示数据&#xff0c;机房收费系统也是非常多的。在这里我们就用到了DataGridView控件。 一&#xff0c;概述&#xff1a; 使用 DataGridView控件&#xff0c;可以显示和编辑来自多种不同类型的数据源的表格数据。它可以通过设置属性直接…

C#Winform的DataGridView控件使用详解2—DataGridView表格样式设置及表格操作

C#Winform的DataGridView控件使用详解2—DataGridView表格样式设置及表格操作 DataGridView表格样式设置DataGridView行序号设置 右键弹出控件表格操作DataGridView新建行DataGridView删除行DataGridView清除内容DataGridView复制DataGridView粘贴 在展示和处理二维数据时&…

C# DataGridView控件的基础应用实例

目录 引言一、界面简介二、初始化三、添加一行数据四、允许修改表格五、复制选择的数据六、复制所有数据七、读一行数据八、读所有数据九、查找名字记录十、删除一行数据十一、删除多行数据十二、清除所有行十三、删除所有列十四、其它&#xff1a;选中单元格十五、最后 引言 …

基于用户的协同过滤个性化音乐推荐系统毕业设计

基于用户的协同过滤个性化音乐推荐系统 摘 要 互联网发展到如今已经完完全全的改变了的生活方式&#xff0c;融入了日常生活&#xff0c;包括交流&#xff0c;出行&#xff0c;消费&#xff0c;娱乐等。与此同时&#xff0c;音乐数据也在与日俱增的变化着。用户在访问一个…

基于深度学习的音乐推荐系统

♚ 作者&#xff1a;沂水寒城&#xff0c;CSDN博客专家&#xff0c;个人研究方向&#xff1a;机器学习、深度学习、NLP、CV Blog: http://yishuihancheng.blog.csdn.net 推荐系统在我们日常生活中发挥着非常重要的作用&#xff0c;相信实际从事过推荐相关的工程项目的人或多或少…

(附源码)计算机毕业设计SSM基于java的音乐推荐系统

&#xff08;附源码&#xff09;计算机毕业设计SSM基于java的音乐推荐系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

【计算机毕业设计】Java基于协同过滤算法的音乐推荐系统

毕设帮助、开题指导、源码交流&#xff0c;联系方式见文末。。 音乐检索系统的开发目的是使音乐检索模式转变成信息管理&#xff0c;为音乐检索人员提供方便条件。对音乐检索的实际情况进行调研之后&#xff0c;进行详细的需求分析&#xff0c;对现有的管理模式进行改进&#x…

java基于springboot+vue协同过滤算法的音乐推荐系统

音乐是人类永恒的话题&#xff0c;无论是在古代还是现代人们对音乐都有一种非常的热爱在里面&#xff0c;同时音乐也寄语了人们对美好事物的憧憬&#xff0c;很多时候人们在试听音乐的时候并不能够及时的找到适合自己的音乐&#xff0c;而且当下很多音乐都是收费的&#xff0c;…

[附源码]java毕业设计网易云音乐推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于python的音乐推荐系统

基于python的音乐推荐系统 算法:基于用户的协同过滤推荐算法 语言:python 数据库:sqlite 框架:django 编号:8448648225698568爱喝可乐的大学生

SpringBoot+Vue项目个性化音乐推荐系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springbootvue Node&#xff1a;node.js JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/idea,Visual Maven包…