我只是想知道如何在不使用每个循环的情况下列出所有面板对象并防止递归过程..
答案 0 :(得分: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;
}
}
}