【发布时间】:2014-08-10 23:36:49
【问题描述】:
我有一个绑定到 DataGridView 的 DataTable。 DataTable 最多填充 30000 行。 DataGridView 应在填充时显示 DataTable 的内容,这可能需要 3 分钟,因为某些计算过程。
每一行包含文本单元格和两个图像单元格。一开始我将所有图像直接加载到数据表中,但在某些时候(约 10000 行)程序崩溃了,因为系统内存不足。所以我稍微调整了我的代码。问题是,图像消耗了大量内存。现在我只加载用户可以看到的图像。这有很大帮助,并且系统不再在加载 30000 行时崩溃。
只有在大量滚动行时才会出现此问题。我使用 Alireza Maddah 提供的代码设置图像:
public void GetVisibleCells(DataGridView dgv)
{´
ClearImages()
var vivibleRowsCount = dgv.DisplayedRowCount(true);
var firstDisplayedRowIndex = dgv.FirstDisplayedCell.RowIndex;
var lastvibileRowIndex = (firstDisplayedRowIndex + vivibleRowsCount) - 1;
for (int rowIndex = firstDisplayedRowIndex; rowIndex <= lastvibileRowIndex; rowIndex++)
{
var cells = dgv.Rows[rowIndex].Cells;
foreach (DataGridViewCell cell in cells)
{
if (cell.Displayed)
{
// This cell is visible...
// SET IMAGES TO ROW AND SAVE INDEX
}
}
}
}
How to find out which DataGridView rows are currently onscreen?
这段代码绑定了滚动事件。如果行对用户可见,我设置图像并将行的索引保存到列表中。在设置图像之前,我调用 ClearImages()。 此函数使用列表中的索引条目将所有包含图像的行设置为空。
我认为将变量设置为 null 不会释放内存,但这只是我的第一个想法。你怎么看?有任何想法吗?
我不能使用分页或虚拟模式...
【问题讨论】:
-
您是否考虑过将缩略图加载到单元格而不是整个图像文件中?
标签: c# datagridview datatable out-of-memory virtual