【C#】フォーム上のコントロールを文字列で取得する方法
今回の記事は「teratail」で乗っていた質問から検証してみようと思って書いています。
記事の回答には
Dim A As Control = Me.Controls("RadioButton1")
ってすればできるよ!って書いてありました。
しかしながら、僕には本当にそうか?という疑問がありました。
なぜかというと、ここでいう「Me」はC#でいう「this」のことなので、「Form」を表すものだと考えたからです。
つまり、PanelやGroupBoxに乗っかってるコントロールは取得できないのではなかろうかと…
そこで今回は以下のようなWindows フォームアプリケーションを作成してみました。
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 9; i++) { var rb = this.Controls["radioButton"+i] as RadioButton; if (rb != null) { rb.Text = "radioButton" + i; } } } }
結果は予想通り、Form上のコントロールのみが操作できました。
これを全部に適用するためには以下のようにするのが手っ取り早いかなと思います。
public partial class Form1 : Form { public Form1() { InitializeComponent(); CreateDictionary(this); } Dictionary<string, Control> ControlDic = new Dictionary<string, Control>(); private void CreateDictionary(Control c) { foreach (Control cc in c.Controls) { ControlDic.Add(cc.Name, cc); if (cc.Controls.Count > 0) CreateDictionary(cc); } } private void Form1_Load(object sender, EventArgs e) { for (int i = 1; i <= 9; i++) { if (ControlDic.ContainsKey("radioButton" + i)) { var rb = ControlDic["radioButton" + i] as RadioButton; if (rb != null) rb.Text = "radioButton" + i; } } } }
これができるようになると何ができるか?
そんなことは考えちゃいけません!!