0

我只想知道如何在不使用每个循环的情况下列出所有面板对象并防止递归过程..

4

1 回答 1

2

在 C# 中:

form.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).
Where(fi => fi.FieldType.Equals(typeof(Panel)))

我使用了反射,因为您写了您不想要递归方法,但是并非您表单中的所有面板都可以这样被发现。如果您在没有定义类成员的情况下创建面板(即使在设计器中也可以完成),您将无法使用此方法获得它。

递归方法:

Panel[] GetPanels(Control container)
{
    List<Panel> panels = new List<Panel>();
    foreach (Control child in container.Controls)
    {
       if (child is Panel)
            panels.Add(child as Panel);
       panels.AddRange(GetPanels(child));
    }
    return panels.ToArray();
}

编辑:上述方法未优化。它正在创建太多列表,不能用作“懒惰”。这是另一个改进的版本:

IEnumerable<Panel> GetPanelsLazy(Control container)
{
    foreach (Control child in container.Controls)
    {
        if (child is Panel)
            yield return child as Panel;

        foreach (var panel in GetPanelsLazy(child))
        {
            yield return panel;
        }                
    }
}
于 2012-08-14T08:26:29.400 回答