|
■No81690 (shu さん) に返信 > このように配列化すると処理しやすいです。
コントロール数が多く、名前で検索した方が都合が良い場合も、 ロード時に配列にしておくことで、次回以降の列挙が楽になりますね。
> たとえばPanelに張り付いているコントロールならpanel1.Controlsを > 使う必要があります。
平坦化する拡張メソッドを使っておくのがお奨めです。
using System.Collections.Generic; using System.Linq; using System.Windows.Forms;
public static class ControlExtensions { public static IEnumerable<Control> GetAllChildren(this Control ctrl) { var ctrls = ctrl.Controls.OfType<Control>(); return ctrls.Concat(ctrls.SelectMany(GetAllChildren)); } }
たとえばフォームの階層構造が
form1 ├panel1 │├panel2 ││├radioButton1 ││├radioButton2 ││└radioButton3 │├textBox1 │└button1 ├textBox2 └button2
だった場合、Controls プロパティですと
foreach (Control ctrl in this.Controls) → panel1, textBox2, button2 が列挙される
foreach (Control ctrl in this.panel1.Controls) → panel2, textBox1, button1 が列挙される
のように、その直下のコントロールしか列挙されませんが、 上記の GetAllChildren 拡張メソッドを用意しておくことで、 子孫コントロールも含めて列挙されるようになります。
foreach (Control ctrl in this.GetAllChildren()) → panel1, panel2, textBox1, textBox2, button1, button2, radioButton1, radioButton2, radioButton3
foreach (Control ctrl in this.panel1.GetAllChildren()) → panel2, textBox1, button1, radioButton1, radioButton2, radioButton3
|