我正在创建一个仪表板应用程序,在FlowLayoutPanel
上显示数百个“项目”。
每个“项目”都是UserControl
,由12个文本框或标签组成。
我的应用查询数据库,然后为每条记录创建一个“item”实例,在将数据添加到FlowLayoutPanel
之前用数据填充标签和文本框。
在向面板添加约560个项目后,我注意到我的任务管理器中的USER Objects
计数已经上升到大约7300,这比我机器上的任何其他应用程序大得多。
我认为560 * 13(12个标签加上UserControl本身)是7280.所以突然放弃了所有物品的来源......
知道在Windows抛出之前有10,000个USER对象限制,我试图想出更好的方法将这些“项目”绘制到FlowLayoutPanel
上。
到目前为止我的想法如下:
用户绘制“项目”,使用graphics.DrawText
和DrawImage
代替许多标签。我希望这意味着1项= 1 USER Object
,而不是13。
拥有“item”的1个实例,然后为每个记录填充实例并使用Control.DrawToBitmap()
方法获取图像,然后在FlowLayoutPanel
中使用该图像(或类似) )
所以...有没有人有任何其他建议???
P.S。它是一个可缩放的界面,因此我已经排除了“分页”,因为需要一次查看所有项目
答案 0 :(得分:2)
至少,我会从你的想法#1开始。这确实会减少你的应用程序吞噬的窗口数量13倍。
关于你的想法#2,如果你把Bitmap放入PictureBox(或其他)并因此在你的表单上有大量的PictureBox控件(这甚至可能是更糟,因为Bitmaps有时由比一般RAM更有限的资源组成,这与消耗太多窗口完全不同。)如果您使用生成的位图并将它们复制到一个较大的控件(然后处理位图),这只是一个好主意。
如果采用后一种方法,那么实际上不需要利用渲染到控件的中间步骤,获取控件的位图副本,然后将该位图绘制到最终控件上。采用用于渲染控件的代码/逻辑更有意义,而是直接渲染到最终(多元素)控件。
答案 1 :(得分:1)
你的想法#2是我推荐的。这正是用于显示数千条记录的列表和网格控件能够执行in-place editing的方式。您只需使用一个控件,然后将其移动到您需要的任何位置。
如果你需要同时显示多个实例,那就更难了 - 正如你所提到的,你很可能必须使用DrawToBitmap
并显示控件的“重影”。
或者,我假设这里有一些滚动(实际上没有人可以同时查看7280个UI对象,对吧?),所以你可以做的另一件事是动态创建实际上将要启用的实例屏幕同时。您必须计算可见区域并将其与要显示的控件列表进行比较,如果UI缩小太多而无法实际显示任何详细信息,则只显示占位符。我想如果你这样做,滚动/缩放将成为一个相当CPU密集型的操作;最好不要创造它们。
答案 2 :(得分:1)
我已经实现了#1,效果很好。
用户对象减少13倍,并且感觉更快,响应更快。
感谢您的建议 - 我很惊讶这不是一个更常见的问题!