DataGrid缓慢重绘

时间:2009-05-09 00:15:18

标签: c# datagrid

我正在使用System.Windows.Forms.DataGrid。它填充了大约3000行并且重绘速度非常慢。如果我最小化并最大化我的Form,所有其他控件只显示,但我最终逐行观察DataGrid重绘。如果这会产生影响,那么DataGrid中的所有内容都是只读的。

更新

我不确定如何为我的项目正确实现CellValueNeeded()事件,或者在我的情况下它是否有助于DataGrid的性能。

我正在创建一个包含DataGridView的用户控件(请参阅下面的代码)。调用SetProject()方法时,我的控件被设置为我的Project类的特定实例。然后控件使用静态方法Informa.Data.GetProjectDataTable(Project proj)从Project中提取DataTable。然后将DataGrid的DataSource属性设置为返回的DataTable。

这是我第一次使用ADO或DataGrids做任何事情,所以请耐心等待。看起来CellValueNeed()允许我覆盖DataGrid如何为其中一个单元格找到值,但在我的情况下,这比MSDN上的示例复杂得多。我的数据的实际来源是各种Node对象的树结构,其根目录是Project实例。每个节点都可以有一组可变属性,用户也可以在运行时进行扩展。然后还有许多其他复杂性,节点从其父节点继承属性值,并从其子节点总计其他属性。

Informa.Data.GetProjectDataTable()消除了所有这些疯狂,并生成了所有节点的所有属性的单个平面DataTable。此时,我不关心是否能够将此表的任何更改与原始树结构相关联,或者在树结构更改时更新表的特定部分。我想要做的就是在DataGrid中向用户显示数据。

那么我是否实现了CellValueNeeded()来从Project提供的DataTable中读取?我认为DataGrid已经知道如何有效地将DataTable用作数据源?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Informa;

namespace Informa
{
public partial class ProjectGridControl : UserControl
{
    private Project proj;

    public ProjectGridControl()
    {
        InitializeComponent();
    }

    public void SetProject(Project proj)
    {
        this.proj = proj;
        UpdateGridControl();
    }

    public void UpdateGridControl()
    {
        if (this.proj == null)
        {
            this.dataGrid.DataSource = null;
        }
        else
        {
            //Extracts a DataTable from the project and sets it as the 
            //DataSource of the property grid
            this.dataGrid.DataSource = Informa.Data.GetProjectDataTable(proj);
        }
    }
}

}

5 个答案:

答案 0 :(得分:10)

曾经有一只名叫MacroSoft的小狼,花了一些时间与Vidia the Sheep。他们在这个星球上进行了最慢的文本和网格渲染,并在硬件发展的繁荣年份将所有工作推向了CPU;绵羊确保进一步放慢速度。

如果我是对的,你欠了一封信: - )

你正在运行NVidia卡和他们糟糕的驱动程序或类似的,以及看到MSFT拒绝将GDI +与硬件加速一起加速到友好的供应商(甚至Mono会在他们决定给你一些节能和适当的硬件之前完成它重用;你知道体面的工程)。

将DataGridView包装成新类型(即。inherit)并将其DoubleBuffered属性设置为true,更改设计器代码以使用该新类型。

可见“逐行”渲染是这个行业在2009/2010的桌面和超级计算机上的超级计算机有多糟糕一家大公司拒绝修复但很乐意在Mounta-Dismounta-Vista上执行速度更快。王牌..

答案 1 :(得分:5)

您是否已开启列的自动调整大小?由于启用了自动调整大小,因此我的应用程序中的用户经历了大量减速,只有10行。基本上,一个网格允许用户选中/取消选中一个框以将行添加到另一个网格,并且第二个网格将在每个添加的行中经历指数减速。

经过一些分析后,我发现在第二个表中添加5行需要大约12秒。最后尝试关闭列的自动调整大小,现在它是瞬间的。

答案 2 :(得分:4)

我在缓慢绘制datagridview时遇到了大麻烦。我需要我在屏幕上尽可能大,看起来它的物理尺寸对疼痛速度的影响远大于数据量等。对我来说真正的诀窍是设置CellBorderStyle = None (显然每个单元格负责绘制自己的边框,这看起来很荒谬,因为单元格边框保持固定在屏幕上,因此在滚动时不应该让每个单元格不断地重绘自己的边框,但无论如何......)。 / p>

现在,没有单元格边框的网格实际上并不是一个好的网格。但幸运的是,您可以为列和行设置DividerWidth。这些值默认为0,但将它们设置为1(或者如果你想要更厚的话更高)将使你的“单元格”边框在外观上与CellBorderStyle = Single相同,但这次画的是“静态的”(因为缺少更好的单词) )对于整个datagridview。

此外,如果您有许多行,请将AutoResize属性设置为False。

至少在我的情况下,油漆速度的改善是巨大的。

答案 3 :(得分:2)

DataGridView应该在虚拟模式下没有任何问题。

确保将VirtualMode设置为true(您提到过您尝试过此操作),并正确实施CellValueNeeded

阅读MSDN Walkthrough on VirtualMode了解详情。

答案 4 :(得分:0)

在Visual Studio 2015中,将2 next个AutoSize列设置为None但

DataGridView

引起了非常缓慢的行添加和用户列调整大小的问题。

因此,如果我 REM 超出上述界限,那么UX现在很快。请参阅AutoSizeRowsMode,可能与AutoSizeColumnsMode

相同