使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)

这篇具有很好参考价值的文章主要介绍了使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

在做C/S项目中,做好的窗体出现了页面加载控件缓慢,放大、缩小窗体之后,窗体加载卡顿,以及数据渲染缓慢。

使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)

二、可以利用双缓冲技术去解决这个问题。那么什么是双缓冲?

百度介绍:我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型指针)、宽度、高度、指向新建offscreen数据缓冲区的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度*宽度*每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

总而言之:在计算机中,动画被视为一种变化的图像序列,由一帧一帧的动态图像组成,这些图像随着时间的改变而改变,后一帧图像是对前一帧图像所作的修改。

在单缓冲动画中,图形直接绘制在显示缓冲区,如果显示后一帧图像,必须擦除屏幕,所以在制作过程中需要不断擦除屏幕,这也是屏幕闪烁(窗体加载缓慢)的原因。双缓冲动画有两个缓冲区,除了有显示缓冲区外,还有内存缓冲区,在制作过程中首先把图形绘制在内存缓冲区中,然后讲内存缓冲区中的图像一次性拷贝到心事缓存区,显示缓冲区只是作为内存缓冲区的一个映像。

举例:

投影仪和白板。但缓冲动画:在使用白板的时候,如果写满了,需要写下一页,那么我只能把白板上的内容擦除掉,再去写内容。双缓冲动画:投影仪的时候是需要需要换内容,我直需要把投影仪中的内容进行修改即可,避免擦除操作。

使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)

三、具体方法(代码展示)

1、 C# winform窗体卡顿的解决办法

哪个窗体需要修改页面卡顿,加入此方法

 protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;

                cp.ExStyle |= 0x02000000;

                return cp;
            }
           
        }

该方法是可以解决页面上所有控件加载慢的方法。

在上面的代码中,有用到CreateParams 类,它是具体解决卡顿、闪屏的问题。查阅资料:窗体和控件的属性CreateParams,通过它你能够很方便的控制窗体或控件诸如边框、最大化、最小化关闭,按钮的隐藏、窗体的模式化,弹窗模式等的一些特性

2、那么针对dataGridView加载数据慢,不流畅的现象也可以用以下方法。根源上也是利用了双缓冲技术。

需要在窗体所对应的构造构造函数中写入以下代码,控制DataGridView加载数据延迟的问题。

this.SetStyle(ControlStyles.OptimizedDoubleBuffer //双缓冲
                | ControlStyles.ResizeRedraw 
               | ControlStyles.AllPaintingInWmPaint, //不擦除背景,减少闪烁
                true);
            this.UpdateStyles();

            //利用反射设置DataGridView的双缓冲
            Type dgvType = this.dgvwCustomerManagement.GetType();
            PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
               BindingFlags.Instance | BindingFlags.NonPublic);
            pi.SetValue(this.dgvwCustomerManagement, true, null);
          

四、总结

双缓冲技术是一种用于图形界面绘制的优化技术,通过使用两个缓冲区来减少图像闪烁和提高绘制效率。以下是对双缓冲技术的总结:

1. 原理:双缓冲技术使用两个缓冲区,一个用于绘制图像,一个用于显示图像。绘制图像在后台缓冲区进行,完成后再将整个图像一次性地绘制到前台缓冲区,从而避免了图像闪烁。

2. 优点:使用双缓冲技术可以提高图形界面的绘制效率和用户体验。由于绘制操作在后台进行,用户可以看到一个完整的图像,而不是逐个元素的绘制过程。这样可以减少图像闪烁,并提高用户对界面的感知。

3. 实现方式:实现双缓冲技术可以使用各种编程语言和图形库。一种常用的方式是使用双缓冲绘图对象,将绘制操作指向后台缓冲区,然后将整个后台缓冲区绘制到前台缓冲区。

4. 应用场景:双缓冲技术适用于需要频繁绘制图形界面的场景,如图形编辑器、游戏界面等。在这些场景中,使用双缓冲可以提高绘制效率和用户体验,减少图像闪烁。

5. 注意事项:在使用双缓冲技术时,需要注意内存消耗和性能开销。由于使用了两个缓冲区,可能会增加内存占用。同时,由于每次绘制都需要将整个后台缓冲区绘制到前台缓冲区,可能会增加绘制的时间和CPU开销。

总之,双缓冲技术是一种用于图形界面绘制的优化技术,通过使用两个缓冲区来减少图像闪烁和提高绘制效率。使用双缓冲技术可以改善用户体验,特别是在需要频繁绘制图形界面的场景中。然而,在使用双缓冲技术时需要注意内存消耗和性能开销。文章来源地址https://www.toymoban.com/news/detail-432062.html

到了这里,关于使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 双击dataGridView控件中的数据行,弹出另一个窗体,并将数据传递到另一个窗体中的方法。实现窗体调用,并数据传输

    //实例化学生明细的窗体 public static frmStudentDetail frmsd; //主窗体双击单元格的事件 private void dgvStudent_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)//双击单元格的事件 { //通过Serverice类中的方法得到学生类 Student objectStudent = StudentService.GetStudentInfo(Convert.ToInt32( dgvStudent.Curr

    2024年02月04日
    浏览(41)
  • Winform中实现窗体控件适配(自适应窗体)布局_通过C#代码方式

    即:未启用控件缩放效果代码时,控件内容都是固定在窗体界面的指定位置,不会跟随窗体的拉伸,放大而进行适配,如下图所示: 即:启用控件缩放效果代码时,控件内容会跟随窗体的拉伸,放大而进行适配,如下图所示: 实现思路是: ①在窗体初始化时先获取窗体的宽

    2023年04月17日
    浏览(47)
  • C# winform usercontrol控件跟随主窗体实现自动大小

    usercontrol控件跟随主窗体实现自动大小 今天是跟着哗哩哗哩大学学习C的第N天,但是是学习usercontrol的第一天。 第一天遇到的问题就是如何将usercontrol的大小跟随主窗体的一起变大变小。视频中教得很详细,首先是将usercontrol控件实例化,接着就是设置usercontrol的dock属性为fil

    2024年02月12日
    浏览(48)
  • C#在winForm窗体中添加一个可以自由拖动的控件

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 一、实现步骤 1.创建一个新的Windows窗体项目 2.添加控件如图 3.代码部分 总结 textBox1=鼠标在需要拖动的控件中的坐标 X 值 textBox2=鼠标在需要拖动的控件中的坐标 Y 值 textBox3=需要

    2024年01月19日
    浏览(44)
  • 【WinForm详细教程一】WinForm中的窗体、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox

    .sln文件 :解决方案文件 位置引用 bin文件夹 : 存放项目的编译结果 exe dll debug 调试 release 发布 pdb 位置信息–调试 obj文件夹 object 编译过程中生成的中间临时文件 加快编译速度 Properties 引用 添加引用 --选择需要的程序集 App.config 配置文件 .csproj 项目文件 位置引用 双击打开

    2024年02月08日
    浏览(50)
  • 【WinForm】WinForm常见窗体技术汇总

    窗体调用外部程序与渐变窗体 按回车键跳转窗体中的光标焦点 剪切板操作 实现拖放操作 移动的窗体 抓不到的窗体 MDI窗体 提示关闭窗体 窗体正在变色: 窗体调用网络页面–启动浏览器: 窗体调用本地程序–启动记事本: 按下enter键,光标会向下移动: 第一个text中输入内

    2024年02月08日
    浏览(50)
  • winform窗体闪烁问题解决方式

    winform窗体闪烁问题解决方式 1、使用窗体双缓冲 SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); UpdateStyles(); 窗体的DoubleBuffered 指示是否对控件进行双缓存处理。 2、使用CreateParams的使用解决闪屏问题

    2024年02月12日
    浏览(91)
  • Winform窗体使用IOC容器

    Winform窗体如何使用IOC容器呢?在nuget中添加Microsoft.Extensions.DependencyInjection 接着在Program类Main方法中添加一下代码 在此类中继续补充以下代码 以后你的注入只需要在 static void ConfigureServices(IServiceCollection services)这个方法中注入就行了 全景图:   我把窗体也注入了,不过不是

    2024年02月12日
    浏览(52)
  • C#--耗时操作实现UI界面实时更新不阻塞(耗时操作解决窗体卡顿)

    C#实现窗体加载进度条或者百分比实时显示耗时操作的进度,方法有很多。但是经过我的学习、查找与实际应用,发现Task配合MethodInvoker最为高效便捷。下面我就来结合代码讲一下要注意的问题。 C#在winform上进行耗时操作往往会放置progressbar,问题是在UI线程上进行耗时操作就

    2024年02月03日
    浏览(29)
  • WinForm使用Prism和DryIoc实现跨窗体数据绑定

    使用Prism和DryIoc实现跨窗体数据绑定 开发环境: VS2022 .Net 6.0 WinForm界面程序 要求: DryIoc容器注册为单例(Singleton)=DryIoc VM需要实现数据更改通知=Prism 控件数据限幅要一样=NumericUpDown 🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️🍇️ 效果: Form2修改Score时Form1立即

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包