数以百计的自定义UserControls创建了数千个USER对象

And*_*man 5 .net c# user-controls resource-leak winforms

我正在创建一个仪表板应用程序,显示数百个"项目" FlowLayoutPanel.

每个"项目"是UserControl由12个文本框或标签组成的.

我的应用程序查询数据库,然后为每个记录创建一个"项目"实例,在将数据添加到数据库之前用数据填充标签和文本框FlowLayoutPanel.

在向面板添加约560个项目之后,我注意到USER Objects我的任务管理器中的计数已经上升到大约7300,这比我机器上的任何其他应用程序大得多.

我认为560*13(12个标签加上UserControl本身)是7280.所以突然放弃了所有物品来自哪里......

知道在Windows抛出之前有10,000个USER对象限制,我正试图找到更好的方法将这些"项目"绘制到FlowLayoutPanel.

到目前为止,我的想法如下:

  1. 用户绘制"项目",使用graphics.DrawTextDrawImage代替许多标签.我希望这意味着1项= 1 USER Object,而不是13.

  2. 有1个"item"实例,然后为每个记录填充实例并使用该Control.DrawToBitmap()方法获取图像,然后在FlowLayoutPanel(或类似)中使用它

所以...有没有人有任何其他建议???

PS这是一个可缩放的界面,所以我已经排除了"分页",因为需要一次查看所有项目

Mus*_*sis 2

至少,我会从你的想法#1 开始。这确实会将应用程序占用的窗口数量减少 13 倍。

关于你的想法#2,如果你然后将位图放入PictureBox(或其他),从而在你的窗体上有大量PictureBox控件(这甚至可能更糟,因为位图有时),那根本不会真正帮助你由比一般 RAM 更有限的资源组成,这与消耗太多窗口是完全不同的问题)。只有当您获取生成的位图并将它们复制到单个较大的控件上(然后处理位图)时,这才是一个好主意。

如果您采用后一种方法,那么实际上不需要利用渲染到控件、获取控件的位图副本然后将该位图绘制到最终控件上的中间步骤。采用用于呈现控件的代码/逻辑,而不是直接呈现到最终(多元素)控件会更有意义。