如何避免表单上出现大量用户控件



我正在创建一个用户控件,它表示其他自定义控件的列表(它们非常简单:包括标签、复选框、图标和按钮)。当我把它放在表单上时,加载所有列表项需要很长时间(列表中有100-150个项)。显示大量自定义控件列表的替代方法是什么?

我试着使用SuspendLayout和ResumeLayout,但没有多大帮助,使用它们可以减少时间,但时间仍然太长。

由于各种原因,我无法实现一些想法:

  • 以某种方式只处理落入视图中的项目(如何忽略其他项目?)
  • 实现网格控件行为-仅在编辑模式下创建自定义控件,但很难绘制其他控件

感谢的任何建议

编辑:

有一些使用DataGridView的建议。这是一个好主意,但问题是自定义控件可以更改其大小并在下面显示附加信息(其行为类似于扩展器)。使用DataGridView 并不容易

如果您绑定到WinForms,那么我强烈建议您使用DataGridView。不久前,我遇到了同样的问题,发现DataGridView具有足够的可扩展性,可以列出各种控件(TextBoxes、CheckBoxes,甚至DateTimePickers等)。转换到这个控件极大地加快了我的UI,并且更稳定,更易于维护。

如果每一行都需要更高级的设施,比如您提到的Expander属性,那么我认为您应该研究WPF。有了WPF,您可以非常灵活地按照自己想要的方式完全设计UI控件,而且性能仍然非常好。

如果这两种方法都不适合你,那么重新设计你的用户界面怎么样?如前所述,没有办法减轻大量控件的性能打击。那么,一次只显示一行或几行,使用过滤器或搜索工具让用户找到他们想要的行,怎么样。或者,显示所有行,但在每行中只使用最少的控件,并让用户双击该行以打开一个对话框窗口,显示有关该行的更详细信息?无论如何,你必须减少最初显示的控件的数量。这些只是一些想法。

我同意@Cody的观点,但如果"剥离一些现有的"不是一个选项。。。让我更进一步。。。

你提到你有一份清单。

我会从iOS的剧本中得到一个提示,并且只有在屏幕上显示列表所需的活动控件的数量。

例如;如果列表在屏幕上有30个项目的空间,您可以在用户滚动/翻页列表时重复使用相同的30个控件。

这就引出了另一点-有时稍微修改导航是一个不错的选择。如果你现在有一个巨大的列表,那么可能需要考虑每个"页面"只显示x个项目的"分页"功能。

无论如何,当你在应用程序中达到这一点,并且你有现实世界中的加载速度/内存使用性能要求时,是时候翻开关于性能调优的旧书,实现已验证的模式,如重用、缓存等了。它通常并不总是很漂亮,它会使你的解决方案更加复杂,但你需要做你需要做的事情来使它正常工作。

不幸的是,没有办法不劳而获。生活中的事情不是免费的。如果你的表单上有不合理数量的控件,你将不得不支付加载它们所需的时间。唯一的选择是使用更少的控件。

无论是通过剥离一些现有的,还是通过自定义绘制内置对应对象的较轻版本来实现这一点,都取决于您。但我强烈建议您坚持使用本机控件,只放弃一些现在使用的控件。

除了明显的性能问题外,您所描述的场景还保证会产生用户溢出错误,这是任何调试器都无法修复的。

使用DataGridView并自定义列?

最新更新