我现在在我的应用程序中使用DataGridView控件,我遇到了一个奇怪的内存问题。我根本不使用DataBinding,只是手动填充。我在那里放的数据并不多。我们最常谈论的是20行乘20列数据。
该控件的工作流程是我有一个ComboBox,它有不同的“数据集”,我在你选择时加载它们。因此,常见的使用场景是循环访问comboBox中的数据集,并在dataGrid中查看它们。我所看到的是,当人们在数据集中循环时,应用程序内存使用量立即从100MB跳到1100MB,然后在GC启动时降低。但是如果你快速循环数据集(即比GC更快)在),你将耗尽内存,应用程序将死亡。
调试之后,我发现内存像疯了一样跳起来的主要原因是我在数据网格中有一些像Image Type的列。我用它们来显示一个16x16图标,指示该行的状态。这些图标存储在ImageList中,我只是将它们设置为该单元格的值,因为我填充了数据网格的行。如果我取出图像并用简单的文字替换它们,我看到绝对没有任何记忆峰值。
那么这里的交易是什么?为什么图像,微小的16x16,导致控制在我的记忆上发疯?
更多信息:
切换数据集时的逻辑是:
答案 0 :(得分:1)
DataGridView控件适用于DataBinding。如果您根本不使用DataBinding,我建议您使用ListView控件。
ListView针对显示图像进行了优化。此外,它实例化的内存比DataGridView更轻。另外,ListView控件可让您更改视图:
这些是您在Windows资源管理器中可能遇到的视图。只需要自己定义一个LargeIcons ImageList或SmallIcons ImageList,或者每个都定义一个,具体取决于您允许用户查看的视图。
您也可以将GridLines显示为DataGridView,只是为了给出相同的方面。
答案 1 :(得分:0)
在第3段中,您说您在ImageList中有图标,但在您的项目符号逻辑步骤列表中,您说您要将图像作为图标添加为对象数组。添加到dataGrid的ImageList是否有错?
答案 2 :(得分:0)
顺便说一下,我决定以不同的方式做到这一点。我已经使用自定义绘画在单元格中绘制我的图标。它的效果要好得多。使用此解决方案,网格不再占用内存。
使用ListView是可能的,但不太实用,因为它只支持在第一列中放置图标。所以我不得不做自定义绘画。
答案 3 :(得分:0)
我遇到了这个错误,它似乎是由引用ImageList中的图像引起的。为了解决这个问题,我创建了在项目中显示为内容的图像。然后我使用Bitmap.FromImage(“images / test.png”)在数据表中设置图像值,这个奇怪的内存bug就消失了。
答案 4 :(得分:0)
Datagridviews在图像方面似乎有内存泄漏。在加载数据之前,将datagridview数据源设置为null,然后在数据源上进行dispose(使用GC.Collect())。