Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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#_Optimization_User Controls - Fatal编程技术网

超慢速C#自定义控件

超慢速C#自定义控件,c#,optimization,user-controls,C#,Optimization,User Controls,我制作了一个自定义控件,它是一个FlowLayoutPanel,我在其中放入了一组其他自定义控件(只有按钮,每个按钮都有三个标签和一个叠加的PictureBox) 它可以用大约100个按钮工作,但是如果把它的按钮数增加到1000个,它就有麻烦了。把它增加到5000,20秒后它就死了 我几乎没有自定义代码,我明智地使用了挂起和恢复布局 那么我做错了什么?我确信我的(相当快的)电脑应该能够处理几千个按钮和标签 (我对C#GUI的东西还比较陌生,所以也许我应该做完全不同的事情。) 编辑1: 这几乎是目

我制作了一个自定义控件,它是一个FlowLayoutPanel,我在其中放入了一组其他自定义控件(只有按钮,每个按钮都有三个标签和一个叠加的PictureBox)

它可以用大约100个按钮工作,但是如果把它的按钮数增加到1000个,它就有麻烦了。把它增加到5000,20秒后它就死了

我几乎没有自定义代码,我明智地使用了挂起和恢复布局

那么我做错了什么?我确信我的(相当快的)电脑应该能够处理几千个按钮和标签

(我对C#GUI的东西还比较陌生,所以也许我应该做完全不同的事情。)

编辑1:

这几乎是目前唯一的自定义代码:

flowLayoutPanel1.SuspendLayout();
foreach (DataRow row in dt.Rows) // dt is from a DB query
{
    flowLayoutPanel1.Controls.Add(new PersonButton(row));
}
flowLayoutPanel1.ResumeLayout();
在PersonButton构造函数中:

this.label1.Text = row["FirstName"].ToString().Trim() + " "
    + row["Surname"].ToString().Trim();
(还应该附上一张照片,但我不确定是否有人能看到。)

编辑2:

我想我真的应该使用DataGridView或ListView,但我想要的不仅仅是一行文本和每行一个小图标;我希望它看起来像firefox中的下载视图(Ctrl+J)。(见截图)

谢谢你的投入,顺便说一下。我想我得重新考虑一下


您必须发布一些布局代码,否则我们将无法提供太多帮助

此外,您的最佳选择是评测代码。分析是查明代码中到底是什么执行缓慢的唯一可靠方法。根据我的经验,UI代码尤其如此。

一个C#WinForm应用程序可以处理1000个任何类型控件的实例吗?我不是WinForm大师,但您对应用程序的期望可能是不合理的


您想要显示1000多个任何类型的控件这一事实可能表明您正在从错误的方向接近软件的设计。

在1000多个按钮上,您的GDI资源和/或应用程序的原始句柄可能非常少


不确定你的应用程序应该做什么,但网格或组合框可能是更好的选择。

听起来你真的需要重新考虑你的界面

正如其他人提到的,表单上的控件数量将不可用

然而,我已经做了一些实验,观察了在代码中创建新控件的时间,甚至使用反射,并发现在流布局面板中动态创建的数百个数据绑定控件应该在1到2秒内创建

发布更多的代码示例可能有助于获得更好的答案

更多信息:我刚刚再次运行计时测试,300个控件花费0.5秒,400个控件花费1.9秒,600个控件花费3秒,1000个控件花费6秒

似乎在300和400之间有一个限制,资源开始被过度利用。

5k控件所需的布局逻辑对于任何类型的包装面板来说都太多了。您可能需要研究一种不同类型的控件,该控件设计用于保存数千个条目,类似于一个


DataGridView有几种不同的可用数据,它们适用于所显示的数据类型(图像、按钮、标签)。因为您的数据库查询看起来是返回一个DataTable,所以您可以简单地删除循环。

[Necromatic mode=ON]


您有1000行数据,但只能显示其中的一小部分,因此只创建可见的控件,并在滚动时使用新数据更改其内容;在代码中删除此方法

受保护的重写CreateParams CreateParams { 得到 { CreateParams cp=base.CreateParams; cp.ExStyle |=0x0200000; 返回cp; }
}

您确定这是自定义控件,而不是用户控件吗?听起来好像你做了一个用户控件。你做错了什么?您正在创建数千个控件。有一种更好的方法可以做你想做的事情。“我做错了什么?”在表单上显示1000个按钮。尝试使用页面导航概念,我应该在这里张贴布局代码在评论中吗?flowLayoutPanel1.SuspendLayout();foreach(dt.Rows中的DataRow行){flowLayoutPanel1.Controls.Add(new PersonButton(行));}flowLayoutPanel1.ResumeLayout();这是唯一的自定义代码。除了改变标签的PersonButton构造函数。我担心答案是:)同意!为什么要在一个窗体上显示1000个控件?+1 Matthew,一个用户如何能够跟踪5000个不同的按钮?+1。这属于陈雷蒙的“如果你不得不问,你可能做错了”规则:。可用性是关键:几乎没有理由在一个页面上显示1000多个控件。这么多的数据将淹没用户。你们从来没有在专家级别玩过扫雷游戏,对吗?