将许多标签添加到WinForm缓慢

时间:2012-03-17 12:32:57

标签: c# winforms controls

我正在使用WinForms,并希望添加许多带边框的标签,以便创建某种网格。现在,添加标签非常简单:

for (int i = 0; i < 60; i++)
        {
            for (int j = 0; j < 60; j++)
            {
                var label = new Label();
                label.BorderStyle = BorderStyle.FixedSingle;
                label.SetBounds(i * 10, j * 10, 10, 10);
                this.Controls.Add(label);
            }
        }

但这确实很慢。我几乎可以看到每个方块都是单独绘制的。在创建控件数组并使用Controls.AddRange()添加控件时,会发生同样的事情。

既然我正在绘制3600个控件,我可以想象它有点慢,但我不禁想到有更好的方法来做到这一点。 当我对Control.AddRange()语句进行计时时,秒表告诉我它需要大约1600毫秒。实际绘图似乎需要更长的时间。

有没有什么方法可以解决这个问题并保持一个应用程序有很多控件快速响应?

4 个答案:

答案 0 :(得分:4)

你需要个人控制吗? 对于像这样的任务,我通常在用户控件中覆盖onpaint并自己绘制文本和框。 然后,如果您需要用户输入,只需在自定义文本的顶部放置一个文本框。

答案 1 :(得分:2)

从Form1.Designer.cs中提示:

this.SuspendLayout();

// code to add Labels

this.ResumeLayout(false);  // maybe use true

答案 2 :(得分:1)

考虑创建一个List<Control>,将控件添加到循环中的控件。然后使用this.Controls.AddRange()将控件添加到表单的控件集合中 之后,以填充控件集合。

答案 3 :(得分:0)

您可以尝试将标签添加到新的面板,然后将面板添加到表单:

var NewPanel = new Panel
{
    Dock = DockStyle.Fill
};
for (int i = 0; i < 60; i++)
{
    for (int j = 0; j < 60; j++)
    {
        var label = new Label();
        label.BorderStyle = BorderStyle.FixedSingle;
        label.SetBounds(i * 10, j * 10, 10, 10);
        NewPanel.Controls.Add(label);
    }
}
this.Controls.Add(NewPanel); // (Form).Controls.Add(NewPanel);