循环中的所有控件属性都会更改

时间:2015-05-09 16:18:14

标签: c# winforms

我正在编写一个代码,将透明背景应用于我的所有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上手动应用的相同代码,它的工作正常。我在这里缺少什么?

2 个答案:

答案 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;
}

%