5

我正在创建一个仪表板应用程序,它在FlowLayoutPanel.

每个“项目”是UserControl由 12 个文本框或标签组成的。

我的应用程序查询数据库,然后为每条记录创建一个“项目”实例,在将数据添加到FlowLayoutPanel.

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

我认为 560 * 13(12 个标签加上 UserControl 本身)是 7280。所以这突然泄露了所有对象的来源......

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

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

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

  2. 拥有“项目”的 1 个实例,然后对于每条记录,填充实例并使用该Control.DrawToBitmap()方法抓取图像,然后在FlowLayoutPanel(或类似)中使用该图像

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

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

4

3 回答 3

2

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

关于您的想法#2,如果您将位图放入 PictureBox(或其他任何东西)并因此在您的表单上有大量 PictureBox 控件(这可能更糟,因为位图有时由比一般 RAM 更有限的资源组成,这与消耗太多窗口完全不同)。如果您正在获取生成的位图并将它们复制到一个更大的控件上(然后处理位图),这将是一个好主意。

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

于 2010-06-10T15:57:41.510 回答
1

你的想法#2是我推荐的。这正是旨在显示数千条记录的列表和网格控件能够执行就地编辑的方式。您从一个控件开始,然后将其移动到您需要的任何地方。

如果您需要同时显示多个实例,那么它会有点困难 - 正如您所提到的,您很可能必须使用DrawToBitmap并显示控件的“幻像”。

或者,我假设这里正在进行一些滚动(实际上没有人可以一次查看 7280 个 UI 对象,对吗?),所以您可以做的另一件事是仅动态创建实际将在屏幕上显示的实例同时。您必须计算可见区域并将其与要显示的控件列表进行比较,如果 UI 被缩小太多而无法实际显示任何细节,则只显示占位符。不过,我想如果你这样做,滚动/缩放将成为一个相当耗费 CPU 的操作;最好根本不创建它们。

于 2010-06-10T15:29:13.933 回答
1

我已经实现了#1,效果很好。

用户对象减少 13 倍,而且感觉更快、响应更快。

感谢您的建议 - 我很惊讶这不是一个更常见的问题!

于 2010-06-11T08:38:16.947 回答