我注意到我的Windows 7 64位机器上的C#winform datagrid非常慢。对于具有1000行+足够的列/文本以适应屏幕宽度的标准网格,我看到滚动显着的渲染延迟(即滚动/滚动条移动滞后约0.5秒而不是平滑)。当最大化到全屏时网格特别慢并且随着显示尺寸减小而变得更快。
通过将DataTable绑定到DataGridView实例,GUI是一种简单的设置。我已经研究了双缓冲等常见的罪魁祸首并没有看到太多改进。这台机器在nvidia quadro nvs 420上以Xeon四核和2 x 23英寸屏幕赢得了7位64位。
任何人都知道为什么会这样?
答案 0 :(得分:5)
尝试禁用网格的所有事件处理程序,然后查看网格的执行方式。如果它表现良好,启用一些,直到你遇到性能。即使没有网格的事件处理程序,它仍然执行缓慢,罪魁祸首可能是史蒂夫在他的回答中提到的AutoSizing。
应用程序性能是否会受到其他任何机器的影响?是否需要重新安装与视频驱动程序相关的内容?
编辑:我刚刚制作了一个测试应用程序并看到了你的问题,但当我进行双缓冲时它就消失了? 你是怎么做双缓冲的?
看到这个答案: How to double buffer .NET controls on a form?
我的完整代码,我创建了一个名为DataSet
的20列DataSet1
,然后我创建了一个带有DataGridView
的简单Windows窗体:
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不等。
答案 1 :(得分:1)
您可能想要检查AutoSizeRowsMode和AutoSizeColumnsMode设置。
有时,AutoSizing会降低GUI的速度。