gpt4 book ai didi

c# - foreach 循环似乎变慢

转载 作者:行者123 更新时间:2023-11-30 21:47:31 27 4
gpt4 key购买 nike

我目前正在尝试向 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;博士

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

所有其他控件也将更改背景颜色(取消选择)

如果点击的控件已经被选中,它将取消选择。

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com