foreach循环似乎很慢

时间:2016-07-12 12:57:22

标签: c# winforms performance foreach

我目前正尝试在winforms中为面板添加一些自定义控件。 每个控件都将停靠并构建类似" list"的内容。 现在,我正在尝试实现一项功能来选择/取消选择每个控件。 它工作正常,我的问题是它有时似乎很慢。 目前在面板中约有约50个自定义控件。

modtable.Click += (s, e) =>
{
    foreach (Control m in pnl_ucMods.Controls)
    {
        if(m is ModTableEntry)
        {
            if(m != modtable)
            {
                ((ModTableEntry)m).BackColor = SystemColors.Control;
            }
            else if (m == modtable && m.BackColor == SystemColors.Control)
                m.BackColor = SystemColors.ActiveCaption;
            else
                m.BackColor = SystemColors.Control;
        }
    }
};

每当我点击其中一个控件时,它会改变背景颜色,第二次点击它会改回来,但是只有在我再次点击之前等待一秒钟才能正常工作。如果我点击快速,没有任何反应,我必须再次点击。 我知道winforms不是为了拥有大量的控件而设计的,我知道foreach需要一些时间来遍历所有控件,但也许这里有人知道如何改进代码并解决这个问题。

TL;博士

单击面板中的一个自定义控件将更改其背景颜色。 (选择的)

每个其他控件也会改变背景颜色(取消选择)

如果已选择单击的控件,则将取消选择。

修改 一个小例子来测试这个问题。 只需创建一个新项目,添加代码并调用它。

private void addPanels()
{
    Panel newPanel = new Panel();
    newPanel.AutoScroll = true;
    newPanel.Dock = DockStyle.Fill;
    this.Controls.Add(newPanel);

    for (int i = 0; i < 50; i++)
    {
        Panel childPanel = new Panel();
        childPanel.Size = new Size(100, 30);
        childPanel.Dock = DockStyle.Top;

        childPanel.Click += (s, e) =>
        {
            foreach (Control p in newPanel.Controls)
            {
                if (p is Panel)
                {
                    if (p != childPanel)
                        ((Panel)p).BackColor = SystemColors.Control;
                    else if (p == childPanel && p.BackColor == SystemColors.Control)
                        p.BackColor = SystemColors.ActiveCaption;
                    else
                        p.BackColor = SystemColors.Control;
                }
            }
        };
        newPanel.Controls.Add(childPanel);
    }
}

1 个答案:

答案 0 :(得分:3)

使用MouseDown事件代替Click事件。

当您点击两次太快时,它将是DoubleClick事件,并且不会引发其他Click事件。

征得你的许可,Reza。