🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

4回答

2861閲覧

コードで変数を使ってコントロールを呼び出す方法

asam1005

総合スコア8

C#

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

0グッド

0クリップ

投稿2019/10/15 02:42

WindowsフォームでCheckBoxを複数配置し
それぞれのNameをChk0,Chk1,Chk2....のようにしました。

これをfor文を使ってtrueかfalseか判別を行いたいのですが、
数字の部分を変数に置き換えるような方法はありますか?

よろしくお願いします。

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

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

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

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

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

m.ts10806

2019/10/15 04:43

実際のコードもご提示ください
guest

回答4

0

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 var checkBoxes = Controls 4 .OfType<CheckBox>() 5 .ToList(); 6 foreach (var checkBox in checkBoxes) 7 { 8 Console.WriteLine($"{checkBox.Name}.Checked is {checkBox.Checked}"); 9 } 10}

これを試してみてください。出力ウィンドウに出力されます。

投稿2019/10/15 02:56

Zuishin

総合スコア28669

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

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

Zuishin

2019/10/15 02:58

なお、これはフォームに直接チェックボックスを置いた場合です。たとえば panel1 の上に置いた場合は Controls の代わりに panel1.Controls を使ってください。
asam1005

2019/10/15 03:29

ありがとうございます! foreachの方法はやってはいたのですが、全然違うやり方で勉強になりました! varの使い方も初めてみました。。。勉強します! ですが、今回はどうしてもfor文と変数を用いてやりたかったので、別のアンサーを採用させていただきます。
guest

0

ベストアンサー

更なる別解です。コントロールの名前(本質問の場合、"Chk1", "Chk2"...)で探せるので、名前をループで動的に生成して目的を達することもできます。

DOBON.NET - フォームに配置されているコントロールを名前で探す

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 // CheckBoxは4つ存在するとして 4 for (int i = 1; i <= 4; i++) 5 { 6 var name = $"Chk{i}"; 7 Control[] cs = this.Controls.Find(name, false); 8 if (cs.Length > 0 && cs[0] is CheckBox) 9 { 10 System.Diagnostics.Debug.WriteLine($"{name} - Checked=" + ((CheckBox)cs[0]).Checked); 11 } 12 } 13} 14/* デバッグ出力ウィンドウに、下のように出力される。 15Chk1 - Checked=True 16Chk2 - Checked=True 17Chk3 - Checked=False 18Chk4 - Checked=False 19*/

投稿2019/10/15 03:10

dodox86

総合スコア9254

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

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

asam1005

2019/10/15 04:18 編集

nameにコントロール名をいれて、control型?のcsにnameと同じ名前のコントロールを入れる、であってるでしょうか? 下のコードのように書いてみたのですが、Visualは通ったのですが、CheckedはControlに定義が含まれていないというエラーが出てしまいました。 var name1 = $"ChkUse{i}"; Control[] cs= this.Controls.Find(name1, false); if (cs[0].Visible == true) { if (cs[0].Checked == true) { } } プロパティには確かにあるのですが、含まれていないと出てしまうのはなぜなのでしょうか?
workaholist

2019/10/15 04:50

例示していただいている通りやればできると思いますよ。 ((CheckBox)cs[0]).Checked
dodox86

2019/10/15 05:04

workaholistさんがコメントしてくださっていますが、その通りです。 CheckBoxクラスはControlクラスを継承してできています。ですので、(CheckBox)cs[0]とのようにアップキャストしないと、プロパティであるCheckedプロパティが参照できません。 https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.checkbox?view=netframework-4.8 Control <-- ButtonBase <-- CheckBox ちなみに名前で探すとControl型が返ってきてしまうので、そのオブジェクトがCheckBox型であるとは限りません。正しくCheckBoxクラスであるかを判定させるために、私の例示コードでは cs[0] is CheckBox と書いています。
asam1005

2019/10/15 05:18

すみません、キャストをし忘れていました。。。 キャストするとできました! ありがとうございます! isで判定ができたりしたりするのですね。。。 すごく人間味のある表現で驚いてます。。。
guest

0

こんにちは。

コード例も何もないのでさっぱりした回答ですが、CheckBox の配列を作って下さい。そうすればインデックスでアクセスできます。

投稿2019/10/15 02:52

tamoto

総合スコア4237

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

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

0

複数個のコントロールを走査したいなら
こんな感じでループ書くとか

foreach( var CB in new CheckBox[]{ Chk0, Chk1, Chk2 } ) { ... }

投稿2019/10/15 02:53

fana

総合スコア11985

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

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

asam1005

2019/10/15 03:31

ありがとうございます! foreachでやる方法は試していたのですが、ここまでシンプルじゃなかったので すごく勉強になりました! 今回はどうしてもfor文と変数でやらないといけなかったので他のアンサーを選ばせていただきます。 すみません、、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問