对用户控件实例数量的上限(合理)限制

时间:2009-05-12 07:22:33

标签: c# winforms user-controls

我有一个曾经是树视图控件的菜单,但现在我想让每个项目更加直观,并为树中的每个对象添加更多信息。

我的第一个目的是创建一个表示项目的用户控件,并在运行时将它们添加到面板中。这是一个很好的方法吗?有时可能有超过一百件物品。 我知道理论上你可以在一个表单上有最大数量的控件,但这不是我主要关注的问题。我关心的主要是表现。

我正在考虑的另一个方法是创建一个列表框并在onPaint方法中执行额外的操作。但这似乎有点不稳定,有点太复杂,无法维护。

有什么想法吗?


修改

我通过向面板att form_Load添加200个usercontrol来测试usercontrol-approach 并且实际添加需要相当长的时间,但似乎没有任何性能问题。滚动工作正常,我已经使每个用户控件都可折叠,并且该功能不会以任何方式延迟,即使面板中有大约一百个以上和一百个。

但是......我完全跟踪了吗?

1 个答案:

答案 0 :(得分:6)

UserControls是非常“重”的动物,就像System.Windows.Forms.Control的任何实例一样,因为每个动物包装一个实际的底层本机Win32 Window。每个窗口都需要由操作系统管理,经过测试,发送绘制消息等。

Windows中这种场景的传统解决方案是“虚拟化”控件。而不是创建200个UserControl,维护一个表示每个项目的200个“对象”的数组。创建一个代表整个菜单的“大”控件,向其添加一个ScrollBar,并覆盖OnPaint,仅绘制可见项。

这就是像ListBox和TreeView这样的老派本机控件。

现在我相信Windows可以在这里帮助你,具体取决于你需要获得多少花哨。您要查找的关键字是“所有者绘制的”。来自another answer的琐事:

  

Subclass ListBox。在ctor中,将绘制模式设置为OwnerDrawVariable并覆盖OnDrawItem和OnMeasureItem。

这样,本机控件将处理所有滚动和数学,以确定您在列表中的位置以及从何处开始绘画。