超慢C#自定义控件
我做了一个自定义控件,它是一个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)。 (见截图)
非常感谢您的所有投入,BTW。 我想我必须重新思考……
alt text http://img156.imageshack.us/img156/1057/capture.png
C#WinForm应用程序可以处理任何类型控件的1000个实例吗? 我不是WinForm Guru,但是你对你的应用程序的期望可能是不合理的。
您希望显示1000多种任何类型的控件这一事实可能表明您正在从错误的方向接近软件设计。
你必须发布一些布局代码,否则我们将无法提供太多帮助。
此外,您最好的选择是分析您的代码。 分析是唯一可靠的方法,可以找出代码中缓慢执行的内容。 根据我的经验,UI代码尤其如此。
在1000多个按钮上,您可能在GDI资源和/或应用程序的原始句柄上运行危险。
不知道你的应用程序应该做什么,但网格或combobox可能是更好的选择。
对于任何类型的包装面板,5k控件所需的布局逻辑将太多。 您可能希望研究一种不同类型的控件,它设计了数千个条目 – 类似于DataGridView 。
DataGridView有几种不同的列类型可用于您正在显示的数据类型(图像,按钮,标签)。 由于您的数据库查询看起来返回DataTable,您可以直接将其绑定到DataGridView并删除循环。
听起来你真的需要重新考虑你的界面。
像其他人提到的那样,表单上的控件数量将无法使用。
然而,我已经做了一些实验,看看时间在代码中创建新的控件,甚至使用reflection,并发现在流程布局面板中动态创建的数百个数据绑定控件应该在1到2秒内创建。
发布更多代码示例可能有助于获得更好的答案。
更多信息:我刚刚重新运行我的计时测试,300控制耗时0.5秒,400耗时1.9秒,600耗时3秒,1000耗时6秒。
在资源开始被过度利用的情况下,似乎存在300到400之间的限制。
[Necromantic mode = ON]
您有1000行数据,但只能显示其中的一些,因此只创建可见的控件,并在滚动时重复使用它们用新数据更改其内容。
试试这个; 在代码中删除此方法。
protected override CreateParams CreateParams {get {CreateParams cp = base.CreateParams; cp.ExStyle | = 0x02000000; 返回cp; }}