我目前正在尝试向Winforms的面板中添加一些自定义控件。
每个控件都将停靠并构建类似“列表”的内容。
现在,我正在尝试实现一项功能,以选择/取消选择每个控件。
它的工作正常,我的问题是有时它似乎很慢。
目前,面板中约有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; dr

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

其他所有控件也会更改背景色(取消选中)

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

编辑:
一个测试该问题的小例子。
只需创建一个新项目,添加代码并调用它即可。

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);
    }
}

最佳答案

使用MouseDown事件而不是Click事件。

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

在您的允许下,Reza。

关于c# - foreach循环似乎很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38329583/

10-10 14:39