我目前正尝试在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);
}
}
答案 0 :(得分:3)
使用MouseDown
事件代替Click
事件。
当您点击两次太快时,它将是DoubleClick
事件,并且不会引发其他Click
事件。
征得你的许可,Reza。