c# Winform网格在Windows 7上渲染缓慢

本文关键字:缓慢 Windows Winform 网格 | 更新日期: 2023-09-27 18:08:26

我注意到c# winform datagrid在我的windows 7 64位机器上相当慢。对于具有1000行+足够的列/文本以适应屏幕宽度的标准网格,我看到滚动时明显的渲染延迟(即滚动/滚动条移动延迟约0.5秒而不是平滑)。当网格最大化到全屏时,它会变得特别慢,随着显示尺寸的减小,网格会变得更快。

GUI是通过绑定DataTable到DataGridView实例的简单设置;我研究了双缓冲等常见的罪魁祸首,但没有看到太大的改进。这台机器是win 7 64位,Xeon四核,2 x 23英寸屏幕,nvidia quadro nvs 420。

有人知道为什么会这样吗?

c# Winform网格在Windows 7上渲染缓慢

尝试禁用网格的所有事件处理程序,然后查看网格的执行情况。如果性能良好,则启用一些,直到性能受到影响为止。如果即使没有事件处理程序的网格,它仍然执行缓慢的罪魁祸首可能是自动调整,正如史蒂夫在他的回答中提到的。

应用程序性能在任何其他机器上受到影响吗?是否与需要重新安装的视频驱动程序有关?

编辑:我刚刚做了一个测试应用程序,看到你的问题,但它消失了,当我做了双重缓冲?你是如何实现双重缓冲的?

看到这个答案:如何在窗体上双重缓冲。net控件?

我的完整代码,我做了一个DataSet与20列称为DataSet1,然后我做了一个简单的Windows窗体与DataGridView:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            // comment out the line below for the application to lag
            SetDoubleBuffered(dataGridView1);

            for (int i = 0; i < 10000; i++)
            {
                dataSet1.DataTable1.AddDataTable1Row(GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString(),
                    GetRandomString());
            }
        }
        public static void SetDoubleBuffered(System.Windows.Forms.Control c)
        {
            //Taxes: Remote Desktop Connection and painting
            //http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
            if (System.Windows.Forms.SystemInformation.TerminalServerSession)
                return;
            System.Reflection.PropertyInfo aProp =
                  typeof(System.Windows.Forms.Control).GetProperty(
                        "DoubleBuffered",
                        System.Reflection.BindingFlags.NonPublic |
                        System.Reflection.BindingFlags.Instance);
            aProp.SetValue(c, true, null);
        }

        private Random rand = new Random();
        private string validChars = "0123456789abcdefghijklmnopqurstuvwyz";
        private string GetRandomString()
        {
            StringBuilder builder = new StringBuilder();
            char[] c = new char[rand.Next(15,20)];
            for (int i = 0; i < c.Length; i++)
            {
                c[i] = validChars[rand.Next(0, validChars.Length - 1)];
            }
            return new string(c);
        }
    }
}

测试了超过100,000条记录,每个记录有20列,长度从15-20不等

您可能需要检查AutoSizeRowsMode和AutoSizeColumnsMode的设置。