質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Q&A

解決済

3回答

3337閲覧

C# TextBoxの制御について

kt3

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

0グッド

1クリップ

投稿2016/01/19 13:38

イメージ説明

テキストボックスを10個配置し入力ラベルの右隣りのテキストボックスに1~10の数値を入力すると
数値に合わせた数のテキストボックスがReadOnlyになる様に制御したいのですがどういった方法で
実現可能でしょうか。
ListかDictionaryを使えば楽に実現できそうな気もしますが、あまり使い方が分からない為
ご教示願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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); 9101112 }

このように、
_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

Toyoshima

総合スコア422

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt3

2016/01/20 14:08

分かりやすい解説とサンプルソースのご提示ありがとうございます。 ソース通りに記述しテキストボックスが制御できることを確認できました。 また機会があればよろしくお願い致します。 サンプルソースまでご提示頂き分かりやすかったのでベストアンサーとさせて頂きます。
guest

0

TextBoxにプロパティを持たせて、自分の持っている値より大きければ(小さければ)振る舞いを変えるみたいな実装を書く

投稿2016/01/19 15:46

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt3

2016/01/20 14:12

プロパティでも実現可能なのですね。 自分が勉強不足の為全くイメージがつきません・・ プロパティでの実装についても今後検討してみたいと思います。 ご回答ありがとうございました。 また機会があればよろしくお願い致します。
guest

0

こんな感じでできると思います。

Control[] ctls = Controls.Find("TextBox" + i, false);
ctls[0].Enabled = false;

"TextBox" + iの部分をコントロール名などの配列で
持たせると応用できると思います。

投稿2016/01/19 15:02

Qoo

総合スコア1249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt3

2016/01/20 14:15

配列でTextBoxを持たせる方法も少し考えたのですが 自分の勉強不足の為実装が難しかったです。 ご提示頂いた方法も検討してみたいと思います。 ご回答ありがとうございました。 また機会があればよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問