質問: ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/dedbb3d998002fd569030f892102e765.png) テキストボックスを10個配置し入力ラベルの右隣りのテキストボックスに1~10の数値を入力すると 数値に合わせた数のテキストボックスがReadOnlyになる様に制御したいのですがどういった方法で 実現可能でしょうか。 ListかDictionaryを使えば楽に実現できそうな気もしますが、あまり使い方が分からない為 ご教示願います。
回答: こんにちは。 私なりの実装方法ですが・・・。 まず、Formのメンバ変数として、テキストボックスを格納するリストを宣言しておきます。 以下の private List _txtboxes; の部分です。 ``` public partial class Form1 : Form { private List _txtboxes; public Form1() { InitializeComponent(); ``` 次に、コンストラクタで、このリストのインスタンスを作り、そこに該当のテキストボックスをどんどん 詰めていきます。 そのとき、一番最初にNo.1のテキストボックスのインスタンスを入れて、そこから順に、最後はNo.10のテキストボックスを入れるようにします。 ``` public Form1() { InitializeComponent(); _txtboxes = new List(); _txtboxes.Add(textBox1); _txtboxes.Add(textBox2); _txtboxes.Add(textBox3); ・ ・ ・ } ``` このように、 _txtboxes[0] には No.1のテキストボックス _txtboxes[1] には No.2のテキストボックス _txtboxes[2] には No.3のテキストボックス ・ ・ _txtboxes[9] には No.10のテキストボックス として、リストの添字とテキストボックスのNoに対応関係を持たせておきます 「入力」と書かれたラベルの隣のテキストボックスの、TextChangedイベントハンドラを用意します。 下記の例では、txtInputNo_TextChangedという名前にしました。 そのイベントハンドラで次のように実装します。 ``` private void txtInputNo_TextChanged(object sender, EventArgs e) { //先ず全部のテキストボックスを入力可能にします foreach (TextBox t in _txtboxes) t.Enabled = true; //入力値を取得、intに変換を試みます。失敗した場合はreturnで無視してます。 TextBox txt = (TextBox)sender; int no; if (!int.TryParse(txt.Text, out no)) return; //1~10の値じゃなかったら、無視してreturnしてしまってます。 if (!(1 <= no && no <= 10)) return; //該当のテキストボックスを入力不可にします _txtboxes[no - 1].Enabled = false; } ``` いかがでしょうか。