2011-06-15 41 views
4

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

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

有一些想法,我不能实施各种原因:

  • 以某种方式与陷入视图中的项目才有效(?怎么不理人)
  • 实现电网控制行为 - 创建自定义控制只有在编辑模式下,但很难画其他

感谢您的任何意见

编辑:

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

+3

创建一个UI设计,不需要同时在屏幕上显示大量控件? :D – 2011-06-15 14:08:29

+0

@ShaneC我很乐意!但是,我被要求在屏幕上显示100-150项,我没有其他选择,只能为它们中的每一个创建自定义控件。我应该使用分页吗?我没有在winforms中看到它 – username 2011-06-15 14:10:25

+1

听起来像是神的形式。您可能想要使用多个表单。科学证明,表单上太多的控件会使用户大脑融化。 – jgauffin 2011-06-15 14:10:32

回答

1

我同意@Cody,但是,万一“剥一些,你必须走出的人的”是不是一种选择......让我把它一步......

你提到你有一个列表。

我会从iOS操作手册中提出一个提示,并且只有您需要在屏幕上显示列表的控件数量处于活动状态。

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

这提出了另一点 - 有时略微修改导航是一个很好的选择。如果你现在有一个巨大的列表,可能是一个“分页”功能,你只能显示每个“页面”的x个项目是需要考虑的事情。无论如何,当你在应用程序中到达这一点,并且具有真实世界的加载速度/内存使用性能要求时,现在是时候展开关于性能调优的旧书,并实施经过验证的模式,如重用,缓存等。它通常并不总是漂亮,它使你的解决方案变得更加复杂,但是你需要做的就是做好正确的工作。

+0

呃,(你的最后一段)实际上不太可能帮到你。 Windows必须先创建所有这些控件,然后才能将其显示在屏幕上。这些控件中的每一个(有时是这些控件中的子控件*)代表一个原生的“窗口”(是的,Windows由“窗口”组成,这些程序员有多聪明),并且这不是免费的。即使是应用程序中性能最高的代码也会在这里发挥作用,这是不太可能的。通常的技巧将受挫。唯一的解决方案是最大限度地减少您创建的控件数量。期。 – 2011-06-15 14:27:49

+0

@Cody;我不能不同意你的意见(或者,也许我们在说同样的事情)。因为系统不必重新分配和重新创建相关内存,窗口句柄等,所以重用现有控件(如我在最后一段中提到的那样)绝对有帮助。 – Steve 2011-06-15 15:15:03

+0

是的,这就是为什么我澄清我是特别的只回应你的最后一段。重新使用现有控件绝对是正确的想法。 – 2011-06-15 15:15:50

1

不幸的是,没有办法没有办法得到什么。生活中的事物并不是免费的。如果您的表单上的控件数量不合理,则需要花费加载它们所需的时间。唯一的选择是使用更少的控制。

无论你是通过剥离某些已经出来的,还是通过自定义绘制较轻版本的内置对象来完成,都取决于您。但我高度建议您坚持原生控制,只是沟现几个你现在使用的。

除了显而易见的性能问题之外,您所描述的场景还是会产生一个用户溢出错误,一个没有调试器可以修复的错误。

0

使用DataGridView并自定义列?

+0

这是一个选项,但我的自定义控件可以改变它的大小(实质上它是一个扩展名,有一个标题和显示一些额外的信息)。当用户点击按钮时,它应该扩展它的内容。在电网中做并不容易 – username 2011-06-15 14:25:42

2

如果你绑定到WinForms,那么我强烈建议你改用DataGridView。前段时间我遇到了相同的问题,并发现DataGridView的可扩展性足以列出各种控件(TextBoxes,CheckBoxes,甚至是DateTimePickers等)。过渡到这个控制极大地加快了我的用户界面,并且更加稳定和易于维护。

如果你需要更高级的设备,比如你提到的Expander属性,那么我认为你应该看看WPF。借助WPF,您可以非常灵活地按照自己的方式完全设计UI控件,并且性能仍然非常好。

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

+0

这是一个非常好的主意,但有一个问题。我会更新我的问题 – username 2011-06-15 14:26:55

+0

或尝试实施一些虚拟模式... – 2011-06-15 14:38:12

+0

@Sorin Comanescu VirtualMode暗示我将手动绘制其他所有内容。这就是我所说的无法实现的第二个想法的问题 – username 2011-06-15 14:42:41