Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免表单上出现大量用户控件_C#_Winforms_Performance_User Controls - Fatal编程技术网

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

C# 如何避免表单上出现大量用户控件,c#,winforms,performance,user-controls,C#,Winforms,Performance,User Controls,我正在创建一个用户控件,它表示其他自定义控件的列表(它们非常简单:包括标签、复选框、图标和按钮)。当我将它放在表单上时,加载所有列表项(列表中有100-150项)需要很长时间。显示大量自定义控件列表的替代方法有哪些 我尝试使用SuspendLayout和ResumeLayout,但没有多大帮助,使用它们可以缩短时间,但仍然太长 由于各种原因,有些想法我无法实施: 以某种方式只处理属于某个视图的项目(如何忽略其他项目?) 实现网格控件行为-仅在编辑模式下创建自定义控件,但很难绘制其他控件 谢谢

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

我尝试使用SuspendLayout和ResumeLayout,但没有多大帮助,使用它们可以缩短时间,但仍然太长

由于各种原因,有些想法我无法实施:

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

编辑:


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

不幸的是,没有办法免费获得一些东西。生活中的事情不是免费的。如果表单上的控件数量不合理,则必须支付加载控件所需的时间。唯一的选择是使用较少的控件

您是否可以通过剥离一些您已经拥有的,或者通过自定义绘制内置副本的更轻版本来实现这一点,这取决于您自己。但我强烈建议您坚持使用本机控件,只需放弃一些您现在正在使用的控件


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

我同意@Cody的观点,但是,如果“删除一些您已经删除的错误”不是选项。。。让我更进一步

你提到你有一份清单

我会从iOS playbook中得到一个提示,只需要在屏幕上显示列表所需的活动控件的数量

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

这就引出了另一个问题——有时稍微修改一下导航是个不错的选择。如果你现在有一个大的列表,可能是一个“分页”特性,在这里你只显示每个“页面”的X项。p>
无论如何,当您在应用程序中达到这一点,并且您有实际的加载速度/内存使用性能要求时,是时候重温关于性能调优的旧书,并实现经验证的模式,如重用、缓存等。它通常并不总是漂亮的,而且会使您的解决方案更加复杂,但是您需要做的是使其正常工作。

使用DataGridView并自定义列?

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

如果您在每行中都需要更高级的工具,比如您提到的扩展器属性,那么我认为您应该研究WPF。有了WPF,您就有了极大的灵活性,可以按照您想要的方式完全设计UI控件,而且性能仍然非常好


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

创建不需要同时在屏幕上显示大量控件的UI设计?:D@ShaneC我很乐意!但我被要求在屏幕上显示100-150个项目,我别无选择,只能为每个项目创建一个自定义控件。我应该使用分页吗?我还没有在winformsSounds中看到它像上帝一样。您可能需要使用多个表单。科学证明,表单上过多的控件会让用户的大脑融化。
SuspendLayout
resumellayout
产生了一些可测量的影响,这让我认为您在构造函数之外的其他地方编写过布局代码,比如说
Load
事件处理程序方法?始终将初始化代码放在构造函数中,这样Windows就不必根据您设置的属性多次(重新)创建控件。@Cody Gray问题是,我正在获取创建表单后这些项应该是什么的必要信息。这是一个选项,但我的自定义控件可以更改其大小(本质上,它是一个有标题并显示一些附加信息的扩展器)。当用户单击按钮时,它应该扩展其内容。在网格中执行此操作并不容易。这是一个非常好的主意,但有一个问题。我将更新我的question@SorinComanescu VirtualMode意味着我将手动绘制其他所有内容。这是我描述为a无法实现的第二个想法的问题,不太可能(你的最后一段)实际上会有所帮助。Windows必须先创建所有这些控件,然后才能在屏幕上显示它们。这些控件中的每一个(有时这些控件中的子控件)都代表一个本机“窗口”(是的,窗口由“windo”组成)