DataGrid缓慢重绘

Eri*_*tas 5 c# datagrid

我正在使用System.Windows.Forms.DataGrid.它填充了大约3000行并且重绘速度非常慢.如果我最小化和最大化我的表单所有其他控件只显示但我最终逐行观看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作为DataSource?

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

ram*_*oti 10

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

如果我是对的,你应该给这个地段写一封信:-)

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

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

可见的"逐行"渲染是这个行业2009/2010在台式机和单个DLL上的超级计算机是多么糟糕,一家大公司拒绝修复,但很乐意在Mounta-Dismounta-Vista上执行速度更慢.王牌..

  • 类 DBDataGridView : System.Windows.Forms.DataGridView { public DBDataGridView() { DoubleBuffered = true; } } (3认同)
  • 是的设置双缓冲为真似乎已修复它.谢谢. (2认同)

Chr*_*ett 5

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

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