c# - .NET DataGridView 控件为我占用了大量内存

标签 c# datagridview

我目前在我的应用程序中使用 DataGridView 控件,但遇到了一个奇怪的内存问题。我根本没有使用 DataBinding,只是手动填充。我放在那里的数据一点也不多。我们最多谈论的是 20 行 x 20 列的数据。

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

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

那么这里的交易是什么?为什么图像,很小的 16x16,会导致控件在我这样的内存上发疯?

更多信息:

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

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

最佳答案

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

ListView 针对显示图像进行了优化。此外,与 DataGridView 相比,它在内存中的实例化更轻。此外,ListView 控件可让您更改 View :

  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 资源管理器中可能会遇到的 View 。只需要自己定义一个 LargeIcons ImageList 或 SmallIcons ImageList,或两者之一,具体取决于您允许用户查看的 View 。

您也可以像显示 DataGridView 一样显示 GridLines,只是为了提供相同的方面。

关于c# - .NET DataGridView 控件为我占用了大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2360556/

相关文章:

c# - 亚马逊产品广告 API ItemSearch 返回空值

c# - 在 Windows 应用商店应用程序中显示来自 app.xaml.cs 的 MessageDialog

c# - 如何在 WinForms 项目中将 XML 用作 DataGridView 的数据源?

c# - 使用 C# Windows 窗体应用程序在 datagridview 中拖放

c# - 不允许为可为空的枚举返回 null

c# - 如何使用 Linq to XML 获取数组的数组?

c# - 在我绑定(bind)到 DataGridView(C#、WinForms)的类中使用属​​性(ComponentModel?)设置列宽

c# - SQL 更新 - 不更新 for 循环中的多行

c# - 为什么要对 String.Length 进行签名?

c# - 条件 DataGridView 格式化