超慢C#自定义控件

时间:2009-02-25 21:09:31

标签: c# optimization user-controls

我已经制作了一个自定义控件,它是一个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

7 个答案:

答案 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;              }         }