Winforms:具有数千个用户控件的可滚动FlowLayout面板 - 如何防止内存泄漏并以正确的方式处置对象

本文关键字:何防止 内存 泄漏 面板 对象 方式处 FlowLayout 滚动 控件 用户 千个 | 更新日期: 2023-09-27 18:34:36

我对Windows表单编程比较陌生。我正在开发一个Windows表单应用程序,它要求用户滚动表单(我在表单中使用了带有AutoScroll=True的FlowLayoutPanel(。面板的源包含一个用户控件,该控件根据记录数循环访问。

例如,如果数据库中存在 10 条记录,则在加载窗体时将创建 10 个用户控件并将其添加到面板中,并且用户将能够滚动浏览这 10 个项目。(请参阅描述此场景的示例图像(示例屏幕图像

问题:

当记录数较多(例如 1000(时,会出现此问题,因为未释放用户控件对象并且超出了句柄限制,应用程序崩溃(并显示消息:创建窗口句柄时出错(。我知道这是内存泄漏或设计错误的问题。

但是我无法在这里找到可靠的解决方案,我已经考虑了以下选项(以克服该问题(,但不确定如何继续这些选项:

  1. 仅加载用户屏幕上可见的用户控件,并动态释放其他用户控件(当用户滚动或按下向上/向下按钮时(
  2. 是否可以在面板中将用户控件
  3. 呈现为图像,并且在悬停或单击任何部分时,可以重新初始化用户控件并触发加载(这样,实际的用户控件对象将不在内存中(

您能否提出合适的解决方案/在此要求的上下文中处理UserControl对象的正确方法

Winforms:具有数千个用户控件的可滚动FlowLayout面板 - 如何防止内存泄漏并以正确的方式处置对象

我建议去DataGridView.

我将能够持有1000条记录。

您可以选择其中之一

  • 坚持其笔直的网格状布局或
  • 选择混合布局

我的意思是将除当前记录以外的所有记录显示为网格中的一行的解决方案;当前记录可以由UserControl的一个实例放大和覆盖,每当所选行更改时,该实例都会从基础行的数据加载。

有关此技术的示例,请参阅这篇文章;在那里,我展示了如何用更大的区域替换当前行,就像手风琴控件的工作方式一样。

DGV 中的行实际上只是一个Bitmap,因此滚动起来很便宜;使用 DGV 的正常方法是依靠它的能力,用正确类型的编辑控件覆盖一个单元格。

"手风琴技巧"将其扩展到覆盖整行的任意UserControl.

请注意,其他行将占用更少的空间,我认为这是一个奖励。.