.NET DataGridView 控件占用了我大量的内存

Naz*_*eeh 5 c# datagridview

我目前在我的应用程序中使用 DataGridView 控件,并且遇到了一个奇怪的内存问题。我根本没有使用数据绑定,只是手动填充。我放在那里的数据根本不是很多。我们通常讨论的数据最多为 20 行 x 20 列。

该控件的工作流程是,我有一个包含不同“数据集”的组合框,当您选择它们​​时我会加载它们。因此,常见的使用场景是循环浏览组合框中的数据集并查看它们在 dataGrid 中呈现。我看到的是,当人们循环浏览数据集时,应用程序内存使用量立即从 100MB 跳到 1100MB,然后在 GC 启动时下降。但是,如果您快速循环浏览数据集(即比 GC 启动速度更快) in),你将耗尽内存并且应用程序将死掉。

经过调试,我发现内存疯狂跳跃的主要原因是我在该数据网格中有一些图像类型的列。我使用它们来显示一个 16x16 图标,指示该行的状态。这些图标存储在 ImageList 中,我只是在填充数据网格的行时将它们设置为该单元格的值。如果我取出图像并用简单的文本替换它们,我绝对不会看到任何内存峰值。

那么这是怎么回事呢?为什么图像,很小的 16x16,会导致控件对我的内存如此疯狂?

更多信息:

我切换数据集时的逻辑是:

  • 清除所有网格行:dataGrid.Rows.Clear();
  • 清除所有列:dataGrid.Columns.Clear();
  • 将列添加到 dataGrid 控件:(大多数类型为字符串,还有一些 DataGridViewImageColumn)
  • 使用 dataGrid.Rows.Add(object[] data); 逐行添加我拥有的数据 (数据包括我需要用作图标的图像)。

Wil*_*ler 2

DataGridView 控件旨在与 DataBinding 一起使用。如果您根本不使用 DataBinding,我建议您使用 ListView 控件。

ListView 针对显示图像进行了优化。此外,实例化它比 DataGridView 占用的内存更小。另外,ListView 控件允许您更改视图:

  1. ListView.View = View.Details;
  2. ListView.View = View.LargeIcons;
  3. ListView.View = View.List;
  4. ListView.View = View.SmallIcons;
  5. ListView.View = View.Tile.

这些是您可能在 Windows 资源管理器中遇到的视图。只需要为自己定义一个 LargeIcons ImageList 或 SmallIcons ImageList 或其中之一,具体取决于您允许用户查看的视图。

您还可以将 GridLines 显示为 DataGridView,只是为了提供相同的外观。