テキストボックスを10個配置し入力ラベルの右隣りのテキストボックスに1~10の数値を入力すると
数値に合わせた数のテキストボックスがReadOnlyになる様に制御したいのですがどういった方法で
実現可能でしょうか。
ListかDictionaryを使えば楽に実現できそうな気もしますが、あまり使い方が分からない為
ご教示願います。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
こんにちは。
私なりの実装方法ですが・・・。
まず、Formのメンバ変数として、テキストボックスを格納するリストを宣言しておきます。
以下の
private List<TextBox> _txtboxes;
の部分です。
C#
1 public partial class Form1 : Form 2 { 3 private List<TextBox> _txtboxes; 4 5 public Form1() 6 { 7 InitializeComponent();
次に、コンストラクタで、このリストのインスタンスを作り、そこに該当のテキストボックスをどんどん
詰めていきます。
そのとき、一番最初にNo.1のテキストボックスのインスタンスを入れて、そこから順に、最後はNo.10のテキストボックスを入れるようにします。
C#
1 public Form1() 2 { 3 InitializeComponent(); 4 5 _txtboxes = new List<TextBox>(); 6 _txtboxes.Add(textBox1); 7 _txtboxes.Add(textBox2); 8 _txtboxes.Add(textBox3); 9 ・ 10 ・ 11 ・ 12 }
このように、
_txtboxes[0] には No.1のテキストボックス
_txtboxes[1] には No.2のテキストボックス
_txtboxes[2] には No.3のテキストボックス
・
・
_txtboxes[9] には No.10のテキストボックス
として、リストの添字とテキストボックスのNoに対応関係を持たせておきます
「入力」と書かれたラベルの隣のテキストボックスの、TextChangedイベントハンドラを用意します。
下記の例では、txtInputNo_TextChangedという名前にしました。
そのイベントハンドラで次のように実装します。
C#
1 private void txtInputNo_TextChanged(object sender, EventArgs e) 2 { 3 //先ず全部のテキストボックスを入力可能にします 4 foreach (TextBox t in _txtboxes) 5 t.Enabled = true; 6 7 //入力値を取得、intに変換を試みます。失敗した場合はreturnで無視してます。 8 TextBox txt = (TextBox)sender; 9 int no; 10 if (!int.TryParse(txt.Text, out no)) return; 11 12 //1~10の値じゃなかったら、無視してreturnしてしまってます。 13 if (!(1 <= no && no <= 10)) return; 14 15 //該当のテキストボックスを入力不可にします 16 _txtboxes[no - 1].Enabled = false; 17 18 }
いかがでしょうか。
投稿2016/01/20 06:21
総合スコア422
0
こんな感じでできると思います。
Control[] ctls = Controls.Find("TextBox" + i, false);
ctls[0].Enabled = false;
"TextBox" + iの部分をコントロール名などの配列で
持たせると応用できると思います。
投稿2016/01/19 15:02
総合スコア1249
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/20 14:08