我知道关于慢DataGridViews有几个问题,但我确实尝试了其中提到的所有问题,大多数都是关于更复杂的绑定。
我以前做过的事:
此示例仅为主窗体中的数据网格视图,即“设计器工具箱中的普通库存”,“编辑”。

即使它只有100条线,当滚动和重绘时,它感觉非常滞后,而且它正在使一个核心变大。
当我在datagridview中滚动时,我做了一个VS分析器会话:

我想深入了解到底是什么使这个控件变得如此缓慢,以及如何加速它,或者我可以使用哪些替代方法来获得一个快速表,该表可以通过单击列标题进行排序。
public partial class Form1 : Form
{
List<Record> myData;
public Form1()
{
InitializeComponent();
myData = getListofRecord();
dataGridView1.DataSource = myData;
}
private static List<Record> getListofRecord()
{
var myTable = new List<Record>();
for (int i = 0; i < 500; i++)
{
myTable.Add(new Record() { a = 121+i, b = 123.2434F, c = 2342, d = 312+i*2, e = 123343, f = 12323 });
}
return myTable;
}
}
public class Record
{
public Single a { get; set; }
public Single b { get; set; }
public Single c { get; set; }
public Single d { get; set; }
public Single e { get; set; }
public Single f { get; set; }
}编辑:
两天后,当在同一台机器上重新运行测试应用程序时,我得到了一个不同的结果。就像我所期望的那么快,而且分析结果可能会导致原因?在热路径堆栈中,缺少CreateSemiCompatibleDIB。

Edit2:
不管第一种差异背后的真正原因是什么,通过反射打开双缓冲的效果最明显,大约快20倍。我在其他DGV问题中看到了这些建议,但只是期望得到一点视觉上的改善,而不是一次全新的体验。
分析热路径现在显示一个完全不同的调用堆栈。

Edit3
为了在这个问题中保存我的分析工作,而不是被删除为重复,我想得到一些客观数字,以毫秒为重绘的DGV。我需要在哪里放置秒表才能拿到这些?
发布于 2019-10-29 10:27:59
就这么简单,多亏了TaW:
using System.Reflection;
static void SetDoubleBuffer(Control dgv, bool DoubleBuffered)
{
typeof(Control).InvokeMember("DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null, dgv, new object[] { DoubleBuffered });
}和VB.NET:
Public Sub DoubleBuffered(ByVal dgv As DataGridView, ByVal setting As Boolean)
Dim dgvType As Type = dgv.[GetType]()
Dim pi As PropertyInfo = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance Or BindingFlags.NonPublic)
pi.SetValue(dgv, setting, Nothing)
End Sub发布于 2021-07-05 13:32:16
如果像我这样的人找不到合适的解决方案,甚至所有建议的事情都做了,我就写这篇文章作为答案。我也有同样的问题,也尝试了所有建议的东西,但没有人工作,甚至DoubleBuffered。然后我意识到这是因为我正在处理DataGridView1.CellPainting事件。如果有人像我这样挣扎,那可能是因为一个处理过的DataGridView事件,特别是Cell正在极大地减缓DataGridView。所以,我建议试着摆脱这些处理过的事件。只是这种方法对我有效。
https://stackoverflow.com/questions/48129780
复制相似问题