はじめに
前回までに変数と型をやったので実際に変数同士を比較して、条件分岐していきます。ただ変数同士を比較するだけではアプリとして面白くないので、今回はチェックボックスやラジオボタンといったコントロールを扱ってみます。
お品書き
今回やる内容です
1. 条件分岐
文字通り、条件によって処理を変えることです。例えば入力された値が10より大きければ・・・や、入力された値が3ならば・・・というように処理を分岐させていきます。C# で条件分岐を行うときは if や switch などを使います。
1.1 if 文
if 文はあらかじめ場合分けが決まっており、真か偽かで処理を変えます。大抵は2通りで次のように表します。if で囲んだ部分は条件式に合っている場合、else はそれ以外の場合を示します。
if (条件式) { 処理1 } else { 処理2 }
1.2 switch 文
条件分岐がいくつも分かれている場合です。例えばテレビのチャンネルのように、チャンネルの番号によってそれぞれテレビ局が変わるのと同じです。
switch (変数) { case 値1: 処理1 //変数が値1の条件に合うとき、処理1を実行 break; case 値2: 処理2 //変数が値2の条件に合うとき、処理1を実行 break; //分岐させたいだけ case を用意する //上記に当てはまらなかった場合 default: 処理 n break; }
2. 比較演算子
変数同士を比較するために使用する記号 (演算子) です。代表的なものを挙げるとこんな感じです。変数 A と B を用意します。
演算子 | 意味 | 例 |
---|---|---|
== | 等しい | A == B (AとBが等しい) |
!= | 等しくない | A != B (AとBが等しくない) |
< | より小さい(未満) | A < B (AはBより小さい) |
> | より大きい(超過) | A > B (AはBより大きい) |
<= | 以下 | A <= B (AはB以下) |
>= | 以上 | A >= B (AはBより大きい) |
! は否定という意味があるので、単に ! を付けると否定の意味になります。この比較演算子と条件分岐をつかうことで、場合分けによる処理が可能となります。
3. 条件分岐による場合分け
では実際に動かしてみます。2つの文字列を認識して、それらが同じ文字列であるかを判定します。
デザインビューに Textbox を2つと Button を1つ配置してください。
Textbox に x:Name をそれぞれ付けます。例として textA と textB という名前を付けました。名前を付けたら Button をダブルクリックしてください。そして、それぞれのテキストから文字列を受け取り、変数に代入して条件分岐で場合分けします。条件によって、メッセージの内容を変えて表示してみます。
private void Button_Click(object sender, RoutedEventArgs e) { string A = textA.Text; string B = textB.Text; if (A == B) { MessageBox.Show("同じ文字が入力されています。"); } else { MessageBox.Show("異なる文字が入力されています。"); } }
2つのテキストボックスの文字列が同じであればこのように表示されます。
異なれば、このように表示されます。
次に switch 文を使ってみます。テキストボックス1つだけ使って、特定の文字列を判別させてみます。
private void Button_Click(object sender, RoutedEventArgs e) { string A = textA.Text; switch (A) { case "おはよう": MessageBox.Show("おはようございます。"); break; case "こんにちは": MessageBox.Show("こんにちは。"); break; case "こんばんは": MessageBox.Show("こんばんは。"); break; default: MessageBox.Show(A); break; } }
これを実行すると、挨拶したときに挨拶してくれるようになります。挨拶以外の内容を入力すると、オウム返しするようになります。試してみてください。
4. チェックボックスとラジオボタン
ここまではアプリっぽくないので、チェックボックスとラジオボタンを設置して、その値を取得してみたいと思います。取得した値をもとに、条件分岐させてみます。
まずは Checkbox と Radiobutton をデザインビューに配置します。そしてそれぞれに x:Name を追記、表示名を変更してください。自分の場合はこんな感じです。
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Button Content="確定" HorizontalAlignment="Left" Margin="71,118,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> <CheckBox Content="チェック" HorizontalAlignment="Left" Margin="50,59,0,0" VerticalAlignment="Top" x:Name="checkbox1"/> <RadioButton Content="赤" HorizontalAlignment="Left" Margin="141,36,0,0" VerticalAlignment="Top" x:Name="radiobutton1"/> <RadioButton Content="青" HorizontalAlignment="Left" Margin="141,56,0,0" VerticalAlignment="Top" x:Name="radiobutton2"/> <RadioButton Content="緑" HorizontalAlignment="Left" Margin="141,76,0,0" VerticalAlignment="Top" x:Name="radiobutton3"/> </Grid> </Window>
配置した状態で実行してみるとこんな感じです。
このままでは何もしないので、ロジック側を編集します。
private void Button_Click(object sender, RoutedEventArgs e) { string check; string radio; if (checkbox1.IsChecked == true) { //チェックボックスがオンのとき check = checkbox1.Content.ToString(); } else { check = "チェックされてません。"; } if (radiobutton1.IsChecked == true) { radio = radiobutton1.Content.ToString(); } else if (radiobutton2.IsChecked == true) { radio = radiobutton2.Content.ToString(); } else if (radiobutton3.IsChecked == true) { radio = radiobutton3.Content.ToString(); } else { radio = "選択されていません。"; } MessageBox.Show("チェック:" + check + "\n選択されているもの:" + radio); }
できたら実行してみます。すると、条件分岐によって各コントロールの表示名が変数に代入されて、それがメッセージとして表示されるようになっています。
IsChecked はチェックされているかどうかの値を取得します。チェックされてるかされてないかなので、True か False が取得できます。
Content は表示名を示しており、これを取得するとコントロール名ごと値を取得できます。が、表示名だけ欲しいので ToString() というものを付けます。
本来、ToString() は型を文字列に変換する意味があります。生のデータは object 型なのでこれを付けないとそのままのデータを受け取ってしまいます。これは結構つかうので、覚えておくといいかもしれません。
else if というのがでてきましたが、if と同じように条件式を用いて比較できます。if だけで分岐させると、1番目の if の条件に当てはまったとしても、2番目、3番目・・・というようにすべてチェックしていくので効率が悪いです。else if ならば、1番目で引っかかれば後はすっ飛ばすので効率が良くなります。
おわりに
さて、条件分岐まで来たので次回は繰り返し処理ですね。
アプリで繰り返し処理するのは良くないのですが、何度も繰り返す必要のあるものを楽に実装できます。なぜ繰り返しが良くないか、次回明らかになります。
参考にどうぞ
github.com