しかしまあ、なんですなあ~
ラジオボタンとはこういうやつだ。
どれか一つをONにすると他のボタンはOFFになる。
ちなみに上図のボタンはこの写真から借用した。
これはラジカセボタンやがな⁉という突っ込みがあるかもしれない。
あるいは、ラジカセの一時停止ボタンは再生ボタンが押されている場合でも同時に押せるなどの突っ込みがあるかもしれない。
まあ、その通りなのだが最近のラジオは
ソニー ホームラジオ SRF-V1BT | ソニー CDラジオ ZS-E30 |
こういうシンプルなスタイルが多いので、昔ながらの機械式の押しボタンスイッチで選局するタイプがアマゾンでも見付からない。
右のラジオはシンプルなデザインでいいなあ。
兎に角、昔の車のカーステレオの機械式ラジオ選局ボタンのように、例えばNHKボタンを押したら今まで聴いていたTBSボタンが解除されて、NHKに切り替わるような動作のボタンがラジオボタンだ。
つまりラジオボタンとは、カーステレオでもプログラムの世界でも、
- オンに出来るのは一つのボタンのみ。
- 複数のボタンが同時にオンになる事はない。
- 全てのボタンがオフの状態はある。つまり初期状態でどれも選択されていない場合。
である。
この記事では、C#のWindow フォームアプリに於いてラジオボタンの状態を取得する手法を紹介したい。その過程で LINQ やヌル合体演算子 ?? も少しだけ学習しよう。
テスト環境は以下の通り。
Windows 10 x64 Professional
Visual Studio 2017 Community
.Net Frameworkバージョン 4.6.2
C# Windows フォームプロジェクト
C#でチェックされているラジオボタンを取得する処理
さて、前置きが長くなってしまったが、今回の小技はC#でWindows Form アプリを作成する場合に、グループボックス内のラジオボタン群の中からチェックされているものを見付ける処理だ。
こういう例である。
この場合、二つのグループボックスがあるので二種類の手法を紹介したい。
- 特定のグループボックスを指定してその中のチェック済ラジオボタンを取得する方法
- Form上の全グループボックスに対してチェック済ラジオボタンを全取得する方法
の二つだ。
特定のグループボックス上のチェック済ラジオボタンを取得する方法
まず最初の例である。
変数名がヘンテコだなあという突っ込みも有るかもしれないが、気にしないで頂きたい。
private void button1_Click(object sender, EventArgs e) { // 指定したグループ内のラジオボタンでチェックされている物を取り出す var RadioButtonChecked_InGroup = groupBox1.Controls.OfType<RadioButton>() .SingleOrDefault(rb => rb.Checked == true); // 結果 if (RadioButtonChecked_InGroup == null) { Console.WriteLine("どのボタンもチェックされとらん。"); } else { Console.WriteLine("チェックされているボタンの文字列 = {0}", RadioButtonChecked_InGroup.Text); Console.WriteLine("チェックされているボタンのお名前 = {0}", RadioButtonChecked_InGroup.Name); } }
これを実行すると以下の結果となる。
実行結果
チェックされているボタンの文字列 = radioButton3 チェックされているボタンのお名前 = radioButton3
今の場合、ラジオボタンを単に貼り付けただけなので、その名前(Name)も、表示されるCaption文字列(Text)もデフォルト値のままなので同じ ”radioButton3” が表示されている。
Form上の全グループボックスに対してチェック済ラジオボタンを全取得する方法
Formの上に複数のグループボックスが有る場合に、一個ずつ名前を指定して取得しても良いが、ここでは一気に全部を取得する方法の紹介だ。
ワテの苦手なLINQと言うやつを使ってみた。
private void button1_Click(object sender, EventArgs e) { // 指定した複数のグループ内のラジオボタンでチェックされている物を全部取り出す var RadioButtonCheckedAll_InGroups = new[] { groupBox1, groupBox2 } .SelectMany(g => g.Controls.OfType<RadioButton>() .Where(r => r.Checked)); // 結果 foreach (var rb in RadioButtonCheckedAll_InGroups ?? new RadioButton[0]) { Console.WriteLine("チェックされているボタンの文字列 = {0}", rb.Text); Console.WriteLine("チェックされているボタンのお名前 = {0}", rb.Name); } }
変数名がますますヘンテコだ。まあ気にしない。
実行結果は以下の通り。
実行結果
チェックされているボタンの文字列 = radioButton3 チェックされているボタンのお名前 = radioButton3 チェックされているボタンの文字列 = radioButton7 チェックされているボタンのお名前 = radioButton7
これで無事に全てのグループボックス上のチェックボックスを調べてチェックされている要素を取得する事が出来る。
さて、本題とは関係は無いが、ついでに一つ覚えておくと良い小細工を紹介しよう。
null 合体演算子を使う小細工
foreachループでは ?? 演算子(null 合体演算子)を使っている。
つまり、もしどのラジオボタンもチェックされていない場合には、取得結果が入る予定の配列変数 RadioButtonCheckedAll_InGroups は初期値の null のままである。
配列やListがnullのままforeachループを実行すると NullRefException が throw される。それを回避する小細工が ?? new RadioButton[0] だ。この記事でも触れている。
要するに、もし ?? の左側の式が null の場合には ?? の右側の式の値を使うと言う演算子が??だ。
null 合体演算子と言う。ヘンテコな名前だ。
何が合体しているのかは不明だ。
左辺と右辺が合体していると言う意味なのか?
まあ、そう言う感じかな。
さて、今の場合、その右辺は、
new RadioButton[0]
これで、大きさ0の配列を作る小細工。
と言う事で、forループは
for(var rb null){ ・・・ }
なら例外が出るが、
for(var rb in new RadioButton[0]){ ・・・ }
なら例外は出ない。かつ、要素が0なのでループ内は実行されない。
つまりまあ、nullチェックするなら最初の例で示したif-elseの構文、
if (RadioButtonChecked_InGroup == null) { ・・・ } else { ・・・ }
を用いてnullチェックをしても良いが、それを一行で書けるのがヌル合体演算子??だ。
ワテのソースコードにはこういう小細工が多い。
まとめ
本記事では、C#でラジオボタンを使う場合にチェックされているものを取り出す二つの手法を紹介した。
一つは、特定のgroupBoxを指定して、その上にあるradioButtonの中でチェック済のものを取得する方法。
もう一つは、複数のgroupBoxを配列で指定して、それらに対して、チェック済ラジオボタンを取得する方法
である。
でも中には一々groupBox名を指定するのが面倒。
兎に角今あるForm1の上にあるラジオボタンでチェックされているものを全部取得したいと言う人もいるだろう。
そう言う人の為に、その手法を説明した記事を作成してみた。
【C#の小技】Formの上の全コントロールを再帰的に取得する【Visual Studio】
参考にして頂きたい。
C#は奥が深い。
C#は.NET Frameworkのバージョンアップと連動して新しい機能がどんどん追加されている。なのでネット検索して情報を得る場合でもその記事の執筆年月日に注意して、日付の新しいものから読むと良い。
古い手法で長々と記述していたものが、最新のLINQなどの手法では一行で記述できるなどのケースも多い。
変数のネーミング規則はちゃんとした手法をマスターすべきだ。
ワテのネーミングセンスは支離滅裂なので真似しないほうが良い。
まあ真似するような物好きな人もいないと思うが。
C#プログラミング応用編 – ASP.NET MVC
Visual Studioを使うとWEBサイトも作成出来る。
2017年のゴールデンウイークを利用して便利なWEBサイトを作ってみた。
名付けて、
何が出来るかと言いますと、
Amazon.co.jp
楽天市場
ヤフーショッピング
の三つのショッピングサイトを同時検索して、商品を価格の安い順に表示出来ると言う、お買い物支援サイトです。
「最安価格サーチ」で、
「Visual Studioプログラミング」をかなり安値で探したい人は こちらから>
「C#プログラミング」をかなり安値で探したい人は こちらから>
もしお使い頂きまして何かご不明な点、改善案などありましたらお知らせ下さい。
本を読む
こういう本を読めばネーミングのセンスが身に付くかもしれない。
有名な本だ。それにしても「完全なプログラミング」って、凄いタイトルだ。こういう本を熟読すればワテみたいなヘンテコな変数ネーミングが身に付く事は無いだろう。
もちろんワテは読んだことが無い。それに上下二巻もありトータル1000ページくらいあるな。
もう読む前から挫折しそうだが、チャレンジャーな人はこういう本を読むと良いだろう。
コメント