C#のRadioButtonで選択された項目を調べる(foreach編)

C#のWPFで、ラジオボタン(RadioButton)のどの項目が選択されているのか調べてみました。この投稿で試したのは、foreachで1つずつ調べていくというとても直感的な方法です。

目次

  1. Radio Button
  2. 手順
  3. 試してみた
    1. XAML
    2. コード
    3. 動かしてみた

Radio Button

ラジオボタンというのは、ユーザーに複数の選択肢を提示して、その中から1つの項目を選択してもらうときに使用するコントロールです。

項目毎にRadioButtonコントロールを配置し、複数のRadioButtonコントロールをグループ化して使用します。

ということで、RadioButtonコントロールを使用する場合は、どのコントロールが選択されているのかを調べる必要があります。方法の1つとして、データ保持用のクラスをバインドさせる方法があります。この方法を使うと、プログラム内のどこからでもデータ保持クラスを参照すれば何が選択されているかわかるので使いやすいのですが、私のような素人には分りにくくもあります。

ということで、foreachを使って1つ1つ調べてみる方法を試してみました。

手順

  1. パネルコントロール(今回はStackPanel)を使って、ラジオボタンをグループ化します。

  2. パネルコントロールのChildrenプロパティを参照して、子要素(ラジオボタン)のコレクションを取得します。

  3. foreachでコレクションの各要素のIsCheckedプロパティの値を調べます。

  4. IsCheckedがTrueの要素が見つかったら、foreachから抜けます。(ラジオボタンは排他制御されるので、1つしか選択されません。)

試してみた

3つの選択肢のうち1つを選択したら、TextBoxにその選択肢に設定された値を表示するWPFアプリを作ってみます。

XAML

まずはXAMLです。

<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="120" Width="200" >
    <Grid>
        <StackPanel Margin="5">
            <StackPanel Name="panel" >
                <RadioButton Content="かなめ" Tag="まどか" Checked="RadioButton_Checked" />
                <RadioButton Content="むつみ" Tag="ほむら" Checked="RadioButton_Checked" />
                <RadioButton Content="みき" Tag="さやか" Checked="RadioButton_Checked" />
            </StackPanel>
            <TextBox Name="textbox" />
        </StackPanel>
    </Grid>
</Window>

StackPanelが入れ子になってますが、ラジオボタンをグループ化している方のStackPanelのNameプロパティにpanelという名前を設定しました。

各RadioButtonのCheckedイベントに、同じイベントハンドラを設定しました。どのラジオボタンを選択しても、同じイベント(RadioButton_Checked)が実行されます。

コード

コードです。

using System.Windows;
using System.Windows.Controls;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }

        private void RadioButton_Checked(object sender, RoutedEventArgs e)
        {
            // IsCheckedがTrueのRadioButtonを検索して、そのTagプロパティの値をTextBoxに表示する。
            foreach (RadioButton rb in panel.Children)
            {
                if ((bool)rb.IsChecked)
                {
                    textbox.Text = rb.Tag.ToString();
                    break;
                }
            }
        }
    }
}

とても単純です。

foreachループの中ですが、StackPanel.Childrenでパネルの子要素(RadioButton)のコレクションを取得し、その要素をRadioButtonクラスのインスタンスとして取り出します。

(bool)RadioButton.IsCheckedでIsCheckedプロパティの値をbool型に変換して、TrueであればそのインスタンスのTagプロパティの値をTextBox.Textに代入し、foreachループから抜けます。

動かしてみた

ビルドして動かしてみると、下図の様になります。起動直後の状態です。初期値を決めておく必要がある場合は、XAMLかコードからIsCheckedをTrueにしておいて、ウィンドウのLoadイベントからRadioButton_Checked()を呼び出せば良いのかな。

160813-5-01

各ラジオボタンを選択すると、下図の様になります。

160813-5-02

160813-5-03

160813-5-04

ちゃんと選択された項目にあわせて表示が変わりました。

更新日
公開日

広告