我正在编写一个代码,将透明背景应用于我的所有LinkLabel控件。我不想用硬编码标签ID并重复相同的代码。
foreach (Control cType in this.Controls)
{
if (cType.GetType() == typeof(LinkLabel))
{
LinkLabel linkTemp = cType as LinkLabel;
Point pos = this.PointToScreen(linkTemp.Location);
pos = pictureBox1.PointToClient(pos);
linkTemp.Parent = pictureBox1;
linkTemp.Location = pos;
linkTemp.BackColor = Color.Transparent;
}
}
当我尝试上面的代码时,它使奇数编号的按钮变得透明,即
按钮1 - 透明
按钮2 - 不是
按钮3 - 透明
但是我正在重复在不同的linklabel id上手动应用的相同代码,它的工作正常。我在这里缺少什么?
答案 0 :(得分:2)
这是更改控件的Parent属性的不可避免的副作用。由于LinkLabel从表单的Controls集合移动到pictureBox1.Controls集合,修改了 Controls集合。在迭代时修改集合通常会生成InvalidOperationException,但是没有为Controls集合执行此操作。
您需要通过向后迭代集合来解决此问题。像这样:
for (int ix = this.Controls.Count-1; ix >= 0; --ix) {
var linkTemp = this.Controls[ix] as LinkLabel;
if (linkTemp == null) continue;
// etc..
}
有些程序员喜欢使用Linq,这也没关系,但有点混淆了这个问题并且效率不高。关键是制作一个不受修改集合影响的副本:
foreach (var linkTemp in this.Controls.OfType<LinkLabel>().ToList()) {
// etc..
}
答案 1 :(得分:-2)
你可以使用这个&#39; odd&#39;构造:
if (cType.GetType() == typeof(LinkLabel))
代码格式化的一些提示
更改
if (cType is LinkLabel)
到
foreach (Control cType in this.Controls)
{
if (cType.GetType() == typeof(LinkLabel))
{
LinkLabel linkTemp = cType as LinkLabel;
Point pos = this.PointToScreen(linkTemp.Location);
pos = pictureBox1.PointToClient(pos);
linkTemp.Parent = pictureBox1;
linkTemp.Location = pos;
linkTemp.BackColor = Color.Transparent;
}
}
更改
foreach (LinkLabel linkTemp in this.Controls.OfType<LinkLabel>())
{
Point pos = this.PointToScreen(linkTemp.Location);
pos = pictureBox1.PointToClient(pos);
linkTemp.Parent = pictureBox1;
linkTemp.Location = pos;
linkTemp.BackColor = Color.Transparent;
}
到
%