Winforms Datagridview使用ImageColumn时速度太慢

Winforms Datagridview使用ImageColumn时速度太慢,winforms,datagridview,Winforms,Datagridview,在我的winforms应用程序中,我有一个datagridview,如果所有列都是文本框列,则填充+/-5000行大约需要0.8秒 其中一列是整数列,因此我决定将该列更改为ImageColumn,在网格的Cell_formatting事件中,我使用以下代码确定要显示的适当图像: private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (dgv.Columns[e.

在我的winforms应用程序中,我有一个datagridview,如果所有列都是文本框列,则填充+/-5000行大约需要0.8秒

其中一列是整数列,因此我决定将该列更改为ImageColumn,在网格的Cell_formatting事件中,我使用以下代码确定要显示的适当图像:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
    if (dgv.Columns[e.ColumnIndex] is DataGridViewImageColumn && e.ColumnIndex == 1) {
        int cellVal = (int)e.Value;
        switch (cellVal) {
            case 1:
                e.Value = Properties.Resources.Pending;
                dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = "Item pending attention";
                break;
            case 2:
                e.Value = Properties.Resources.Tick
                dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = "File is available";
                break;
            default:
                break;
        }
    }
}
它起作用了。但是,datagridview现在几乎需要5秒来填充自己!!对列进行排序会变得太耗时。现在5秒似乎不算多,但在大约2个月的时间内,行数将增长到大约30000行

有没有更有效的方法来处理这种情况


谢谢你

这可能毫无帮助,但您可以先尝试进行
e.ColumnIndex==1
比较。由于&&是一个短路运算符,因此您不会对dgv求值。对于每一列,Columns[e.ColumnIndex]都是DataGridViewImageColumn


编辑:我真的会使用类似的工具或其他性能工具来查找瓶颈。

您是否检查过瓶颈不在图像的读取和(可能的)调整中


如果你以32×32像素显示图像(比如说),但是它们被存储为128x128像素(比如说),那么每次显示图像时都会有一个调整大小。

< P>如果性能是一个问题,你可以考虑。不,它们都存储并用作10x10像素的图像。我之前忘了提到,我使用BackgroundWorker进行数据绑定,但这不应该有什么区别,因为我所经历的只是影响Ui线程,可能有一个不同/更好的datagridview事件需要处理?顺便说一句,每个图像在FileSizeWorks中有579字节!哦,还有一件事……我的数据查询返回一个DataTable,我的网格绑定到它的DefaultView。。那会有区别吗?(Iv)在这里试图问同样的问题,但没有具体的解决办法:)Profiler只在团队套件中提供……我和专业人员坐在一起。但我记得在某处看到它的命令行版本可用于其他版本。不过你的帖子还是有道理的。我想我只是格外谨慎,没有考虑额外的开销。我不知道这会有多大的不同,但我一定会尝试!谢谢嗨,索林!谢谢你的回复。虚拟模式是否有助于网格本身的数据性能或UI性能?如果是前者,那对我来说就没什么区别了。我的瓶颈是实际的网格格式化事件。我不知道虚拟超限模式是否会有所不同嘿,沙兰。我想说两者都有(尽管对于数据性能来说,需要更复杂的方法,如这里详述的:)。我确实运行了一些简单的(ISIC?)测试(预加载的数据然后以“经典”模式和虚拟模式添加到datagrid中),UI的提升是巨大的。“我不知道虚拟过度绑定模式是否会有所不同”-试一试,你会失去什么?是的,你说得对-我会失去什么?:)
但就我的目的而言,我的网格是完全只读的-没有添加、编辑、删除网格本身。如果我选择虚拟模式路径,我应该至少处理哪些事件/方法?至少,为了快速测试,您可以从虚拟、未绑定模式下的DataGrid开始,并处理CellValueRequired事件。如果您对性能感到满意,我上面提供的两个链接应该可以让您深入了解更多内容。