HeyCHのブログ

慢性疲労のへいちゃんです

【C#】フォーム上のコントロールを文字列で取得する方法

今回の記事は「teratail」で乗っていた質問から検証してみようと思って書いています。
記事の回答には

Dim A As Control = Me.Controls("RadioButton1")

ってすればできるよ!って書いてありました。


しかしながら、僕には本当にそうか?という疑問がありました。
なぜかというと、ここでいう「Me」はC#でいう「this」のことなので、「Form」を表すものだと考えたからです。
つまり、PanelやGroupBoxに乗っかってるコントロールは取得できないのではなかろうかと…


そこで今回は以下のようなWindows フォームアプリケーションを作成してみました。
f:id:HeyCH:20200518010834p:plain

    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上のコントロールのみが操作できました。
f:id:HeyCH:20200518010545p:plain


これを全部に適用するためには以下のようにするのが手っ取り早いかなと思います。

    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;
                }
            }
        }
    }

f:id:HeyCH:20200518010631p:plain


これができるようになると何ができるか?
そんなことは考えちゃいけません!!