3

我有一个带有某些类型控件的 C# 表单,我通过此代码循环所有Labels并重新父:

private void MakeAllLabelTrans(Control frm, Control parent)
{
    foreach (Control ctl in frm.Controls)
    {
        if (ctl is Label)
        {
            ctl.Parent = parent;
            // ctl.BackColor = Color.Transparent;
        }
        else if (ctl.HasChildren)
        {
            MakeAllLabelTrans(ctl, parent);
        }
    }
}

并调用为:MakeAllLabelTrans(this, picBackground);在 Form_Load 事件中,但缺少一些标签(我在循环体中放置了一个消息框 - 它真的不在循环中),但我不知道为什么?

4

2 回答 2

8

您在枚举集合时正在更改集合。这会导致某些项目被跳过。

您应该重写它以首先构建需要重新设置父级的控件列表,然后在第二遍中重新设置它们的父级。

于 2012-11-05T09:57:31.390 回答
1

您不应该修改您正在迭代的集合。

private static IEnumerable<Labels> FindAllLabels(Control container)
{
    foreach (Control ctl in container.Controls)
    {
        var lbl = ctl as Label;
        if (lbl != null)
        {
            yield return ctl;
        }
        else if (ctl.HasChildren)
        {
            foreach (var innerResult in FindAllLabels(ctl))
                yield return innerResult;
        }
    }
}

// now call the method like this if you want to change a property on the label
foreach (var label in FindAllLabels(theForm))
    label.BackgroundColor = Color.White;

// or like this (note the .ToList()) if you want to move the labels around:
foreach (var label in FindAllLabels(theForm).ToList())
    label.Parent = someOtherControl;
于 2012-11-05T10:03:13.990 回答