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