首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么DataGridView (再)画得这么慢?

为什么DataGridView (再)画得这么慢?
EN

Stack Overflow用户
提问于 2018-01-06 17:10:04
回答 2查看 2.5K关注 0票数 2

我知道关于慢DataGridViews有几个问题,但我确实尝试了其中提到的所有问题,大多数都是关于更复杂的绑定。

我以前做过的事:

  • 我测试了DataTable作为数据资源
  • 未绑定数据视图,在循环中填充
  • 用autoColumnResizing测试了很多设置,所有的测试都太慢了。

此示例仅为主窗体中的数据网格视图,即“设计器工具箱中的普通库存”,“编辑”。

即使它只有100条线,当滚动和重绘时,它感觉非常滞后,而且它正在使一个核心变大。

当我在datagridview中滚动时,我做了一个VS分析器会话:

我想深入了解到底是什么使这个控件变得如此缓慢,以及如何加速它,或者我可以使用哪些替代方法来获得一个快速表,该表可以通过单击列标题进行排序。

代码语言:javascript
复制
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。我需要在哪里放置秒表才能拿到这些?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-29 10:27:59

就这么简单,多亏了TaW:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 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
票数 2
EN

Stack Overflow用户

发布于 2021-07-05 13:32:16

如果像我这样的人找不到合适的解决方案,甚至所有建议的事情都做了,我就写这篇文章作为答案。我也有同样的问题,也尝试了所有建议的东西,但没有人工作,甚至DoubleBuffered。然后我意识到这是因为我正在处理DataGridView1.CellPainting事件。如果有人像我这样挣扎,那可能是因为一个处理过的DataGridView事件,特别是Cell正在极大地减缓DataGridView。所以,我建议试着摆脱这些处理过的事件。只是这种方法对我有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48129780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档