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 に答える