C#のラジオボタンの使い方を基礎から解説|選択値の取得・初期値設定・イベント処理まで

はじめに

C#でWindowsアプリを作るとき、ユーザーに複数の選択肢から1つだけ選んでもらいたい場面があります。たとえば「性別」「支払い方法」「会員区分」「表示モード」「検索条件」などです。

このような場面でよく使われるのがラジオボタンです。C#のラジオボタンは、選択肢の中から1つだけを選ばせるための基本的なUI部品で、WinFormsやWPFなどの画面アプリで広く利用されます。

この記事では、C#のラジオボタンの基本から、選択値の取得、初期値の設定、イベント処理、グループ化、実務で使いやすい書き方まで順番に解説します。C#初心者でも理解しやすいように、主にWindowsフォームアプリケーションのRadioButtonを中心に説明し、後半でWPFでの使い方にも触れます。

1. C#のラジオボタンとは

1-1. ラジオボタンの役割と使う場面

ラジオボタンとは、複数の選択肢の中から1つだけを選択するための入力部品です。C#では、WinFormsの場合はRadioButtonコントロールを使います。

たとえば、次のような選択肢に向いています。

C#
男性 / 女性 / 回答しない
C#
現金 / クレジットカード / 電子マネー
C#
一般会員 / プレミアム会員 / 管理者

ラジオボタンは、選択肢が画面上に見えているため、ユーザーがどのような選択肢を選べるのかを直感的に理解しやすいという特徴があります。

一方で、選択肢が多すぎる場合には画面が見づらくなるため、コンボボックスなど別のUIを検討した方がよい場合もあります。

1-2. チェックボックスとの違い

ラジオボタンとよく比較される部品にチェックボックスがあります。

ラジオボタンは、基本的に複数の選択肢から1つだけ選ぶ場合に使います。チェックボックスは、複数選択できる場合や、オン・オフを切り替える場合に使います。

たとえば、「支払い方法を1つ選ぶ」ならラジオボタンが適しています。

C#
現金
クレジットカード
電子マネー

一方、「受け取りたい通知を複数選ぶ」ならチェックボックスが適しています。

C#
メール通知
SMS通知
アプリ通知

C#で画面を作るときは、「1つだけ選ばせたいのか」「複数選ばせたいのか」を基準に使い分けると判断しやすくなります。

1-3. C#でラジオボタンを使う主な画面アプリの種類

C#でラジオボタンを使う代表的な画面アプリには、主に次のようなものがあります。

C#
WinForms
WPF

WinFormsではSystem.Windows.Forms.RadioButtonを使います。Visual Studioのフォームデザイナーから簡単に配置できるため、C#初心者にも扱いやすいです。

WPFではSystem.Windows.Controls.RadioButtonを使います。XAMLで画面を定義し、IsCheckedGroupNameなどを使って選択状態やグループを管理します。

この記事では、まずWinFormsのRadioButtonを中心に解説し、後半でWPFの基本的な違いを紹介します。

1-4. この記事で扱うRadioButtonの前提

この記事では、主にWindowsフォームアプリケーションのRadioButtonを前提に説明します。

コード例では、次のようなラジオボタンがフォーム上にあるものとして解説します。

C#
radioButtonMale
radioButtonFemale
radioButtonOther

また、必要に応じてGroupBoxPanelを使ってラジオボタンをグループ化する方法も紹介します。

WinFormsでは、同じ親コンテナ内に配置されたラジオボタンは、基本的に1つだけ選択される仕組みになっています。この「親コンテナ」がラジオボタンを理解するうえで重要なポイントです。

2. C#でラジオボタンを配置する基本

2-1. Visual Studioのフォームデザイナーで配置する方法

C#のWinFormsアプリでラジオボタンを配置するもっとも簡単な方法は、Visual Studioのフォームデザイナーを使う方法です。

フォームデザイナーでラジオボタンを配置する手順は次の通りです。

  1. Visual StudioでWindowsフォームアプリを開く

  2. フォームデザイナーを表示する

  3. ツールボックスからRadioButtonを選ぶ

  4. フォーム上にドラッグ&ドロップする

  5. プロパティウィンドウでNameTextを設定する

たとえば、性別を選ぶラジオボタンであれば、次のように設定します。

C#
Name: radioButtonMale
Text: 男性
C#
Name: radioButtonFemale
Text: 女性
C#
Name: radioButtonOther
Text: 回答しない

フォームデザイナーを使うと、配置位置や表示文字を視覚的に確認しながら作れるため、初心者には特におすすめです。

2-2. コードでRadioButtonを作成して配置する方法

ラジオボタンは、デザイナーだけでなくコードから作成することもできます。

C#
RadioButton radioButtonMale = new RadioButton();
radioButtonMale.Name = "radioButtonMale";
radioButtonMale.Text = "男性";
radioButtonMale.Location = new Point(20, 20);
radioButtonMale.AutoSize = true;

this.Controls.Add(radioButtonMale);

複数のラジオボタンをコードで追加する場合は、次のように書けます。

C#
RadioButton radioButtonMale = new RadioButton
{
Name = "radioButtonMale",
Text = "男性",
Location = new Point(20, 20),
AutoSize = true
};

RadioButton radioButtonFemale = new RadioButton
{
Name = "radioButtonFemale",
Text = "女性",
Location = new Point(20, 50),
AutoSize = true
};

this.Controls.Add(radioButtonMale);
this.Controls.Add(radioButtonFemale);

動的に選択肢を作りたい場合や、データベースから取得した項目をラジオボタンとして表示したい場合は、コードで作成する方法が役立ちます。

2-3. Text・Name・Checkedなど基本プロパティの意味

C#のRadioButtonでよく使う基本プロパティは次の通りです。

Textは、画面に表示される文字です。

C#
radioButtonMale.Text = "男性";

Nameは、プログラム上でコントロールを識別するための名前です。

C#
radioButtonMale.Name = "radioButtonMale";

Checkedは、ラジオボタンが選択されているかどうかを表します。選択されていればtrue、選択されていなければfalseです。

C#
if (radioButtonMale.Checked)
{
MessageBox.Show("男性が選択されています");
}

Enabledは、操作できるかどうかを表します。

C#
radioButtonMale.Enabled = false;

Visibleは、画面に表示するかどうかを表します。

C#
radioButtonMale.Visible = false;

Tagは、任意の値を持たせるために使えます。表示文字とは別に、内部的な値を管理したい場合に便利です。

C#
radioButtonMale.Tag = "M";
radioButtonFemale.Tag = "F";

2-4. 複数のラジオボタンを並べるときの基本ルール

ラジオボタンは、関連する選択肢をまとめて並べるのが基本です。

たとえば、性別の選択肢なら次のように同じまとまりとして配置します。

C#
男性
女性
回答しない

支払い方法なら、別のまとまりとして配置します。

C#
現金
クレジットカード
電子マネー

ここで重要なのは、異なる種類の選択肢を同じグループに混ぜないことです。

たとえば、フォーム上に性別と支払い方法のラジオボタンをすべて直接配置すると、WinFormsでは同じ親コンテナ内のラジオボタンとして扱われ、どれか1つしか選択できなくなる場合があります。

そのため、複数の選択グループを作る場合は、GroupBoxPanelを使ってグループを分ける必要があります。

3. ラジオボタンをグループ化する方法

3-1. 同じグループ内では1つだけ選択される仕組み

ラジオボタンの大きな特徴は、同じグループ内では1つだけ選択されることです。

たとえば、次の3つのラジオボタンが同じグループにある場合、1つを選ぶと他のラジオボタンは自動的に未選択になります。

C#
男性
女性
回答しない

WinFormsでは、基本的に同じ親コンテナに入っているRadioButton同士が同じグループとして扱われます。

フォームに直接配置したラジオボタン同士は同じグループになります。GroupBoxの中に配置したラジオボタン同士も、そのGroupBox内で1つのグループになります。

この仕組みを理解しておくと、「複数選択できてしまう」「別の項目を選ぶと前の選択が外れる」といったトラブルを避けやすくなります。

3-2. GroupBoxでラジオボタンをグループ化する方法

GroupBoxは、ラジオボタンをグループ化する代表的なコンテナです。

たとえば、性別を選ぶラジオボタンをgroupBoxGenderに入れると、次のような構成になります。

C#
GroupBox: groupBoxGender
- radioButtonMale
- radioButtonFemale
- radioButtonOther

コードで作成する場合は、次のように書けます。

C#
GroupBox groupBoxGender = new GroupBox
{
Text = "性別",
Location = new Point(20, 20),
Size = new Size(200, 120)
};

RadioButton radioButtonMale = new RadioButton
{
Text = "男性",
Location = new Point(10, 25),
AutoSize = true
};

RadioButton radioButtonFemale = new RadioButton
{
Text = "女性",
Location = new Point(10, 55),
AutoSize = true
};

RadioButton radioButtonOther = new RadioButton
{
Text = "回答しない",
Location = new Point(10, 85),
AutoSize = true
};

groupBoxGender.Controls.Add(radioButtonMale);
groupBoxGender.Controls.Add(radioButtonFemale);
groupBoxGender.Controls.Add(radioButtonOther);

this.Controls.Add(groupBoxGender);

GroupBoxを使うと、視覚的にも「この中から1つ選ぶ」というまとまりが分かりやすくなります。

3-3. Panelでグループを分ける方法

ラジオボタンのグループ化にはPanelも使えます。

PanelGroupBoxのような枠線やタイトルを表示しないため、画面デザインをすっきりさせたい場合に便利です。

C#
Panel panelPayment = new Panel
{
Location = new Point(20, 160),
Size = new Size(200, 100)
};

RadioButton radioButtonCash = new RadioButton
{
Text = "現金",
Location = new Point(10, 10),
AutoSize = true
};

RadioButton radioButtonCard = new RadioButton
{
Text = "クレジットカード",
Location = new Point(10, 40),
AutoSize = true
};

panelPayment.Controls.Add(radioButtonCash);
panelPayment.Controls.Add(radioButtonCard);

this.Controls.Add(panelPayment);

Panel内のラジオボタンは、そのPanelの中で1つだけ選択されます。別のPanelGroupBoxに入っているラジオボタンとは別グループとして扱われます。

3-4. 複数グループを1画面に配置する場合の注意点

1つの画面に複数のラジオボタングループを配置する場合は、それぞれの選択肢を必ず別のコンテナに入れるようにします。

たとえば、次のように分けます。

C#
groupBoxGender
- 男性
- 女性
- 回答しない

groupBoxPayment
- 現金
- クレジットカード
- 電子マネー

このように分けることで、「性別で1つ」「支払い方法で1つ」をそれぞれ選択できるようになります。

もしすべてのラジオボタンをフォームに直接配置してしまうと、性別と支払い方法が同じグループとして扱われてしまい、片方を選ぶともう片方の選択が外れる可能性があります。

C#のラジオボタンで複数グループを扱う場合は、「親コンテナを分ける」ことが重要です。

4. C#でラジオボタンの選択値を取得する方法

4-1. Checkedプロパティで選択状態を判定する

ラジオボタンの選択状態を取得するには、Checkedプロパティを使います。

C#
if (radioButtonMale.Checked)
{
MessageBox.Show("男性が選択されています");
}

Checkedtrueであれば、そのラジオボタンが選択されています。falseであれば選択されていません。

単純な画面であれば、各ラジオボタンのCheckedを個別に確認するだけでも十分です。

C#
if (radioButtonMale.Checked)
{
labelResult.Text = "男性";
}
else if (radioButtonFemale.Checked)
{
labelResult.Text = "女性";
}
else if (radioButtonOther.Checked)
{
labelResult.Text = "回答しない";
}

4-2. if文で選択されたラジオボタンを取得する

もっとも基本的な選択値の取得方法は、if文で順番に判定する方法です。

C#
string gender = "";

if (radioButtonMale.Checked)
{
gender = "男性";
}
else if (radioButtonFemale.Checked)
{
gender = "女性";
}
else if (radioButtonOther.Checked)
{
gender = "回答しない";
}

MessageBox.Show("選択された性別:" + gender);

この方法は分かりやすいため、ラジオボタンの数が少ない場合に向いています。

ただし、選択肢が増えるとif文が長くなり、保守しづらくなることがあります。その場合は、foreachTagを使った方法を検討するとよいでしょう。

4-3. foreachでグループ内の選択値を取得する

GroupBoxPanelに入っているラジオボタンから、選択されているものを探すにはforeachを使うと便利です。

C#
string selectedText = "";

foreach (Control control in groupBoxGender.Controls)
{
if (control is RadioButton radioButton && radioButton.Checked)
{
selectedText = radioButton.Text;
break;
}
}

MessageBox.Show("選択値:" + selectedText);

このコードでは、groupBoxGenderの中にあるコントロールを順番に調べています。その中からRadioButtonで、かつCheckedtrueのものを見つけて、表示文字であるTextを取得しています。

同じような取得処理を複数の場所で使う場合は、メソッド化すると便利です。

C#
private string GetSelectedRadioButtonText(GroupBox groupBox)
{
foreach (Control control in groupBox.Controls)
{
if (control is RadioButton radioButton && radioButton.Checked)
{
return radioButton.Text;
}
}

return "";
}

使うときは次のように書けます。

C#
string gender = GetSelectedRadioButtonText(groupBoxGender);
MessageBox.Show(gender);

4-4. Tagプロパティを使って値を管理する方法

画面に表示する文字と、プログラム内部で使う値を分けたい場合はTagプロパティを使うと便利です。

たとえば、画面には「男性」と表示し、内部ではMという値を使いたい場合があります。

C#
radioButtonMale.Text = "男性";
radioButtonMale.Tag = "M";

radioButtonFemale.Text = "女性";
radioButtonFemale.Tag = "F";

radioButtonOther.Text = "回答しない";
radioButtonOther.Tag = "N";

選択されたラジオボタンのTagを取得するには、次のようにします。

C#
private string GetSelectedRadioButtonValue(GroupBox groupBox)
{
foreach (Control control in groupBox.Controls)
{
if (control is RadioButton radioButton && radioButton.Checked)
{
return radioButton.Tag?.ToString() ?? "";
}
}

return "";
}

使用例は次の通りです。

C#
string genderValue = GetSelectedRadioButtonValue(groupBoxGender);

MessageBox.Show("選択された値:" + genderValue);

Textはユーザーに見せる文字、Tagは内部的に扱う値として使い分けると、後から表示文言を変更しても処理に影響しにくくなります。

4-5. 未選択の場合の判定とエラー表示

ラジオボタンに初期値を設定していない場合、ユーザーが何も選択しないまま登録ボタンを押す可能性があります。

その場合は、未選択かどうかを判定してエラーを表示します。

C#
string gender = GetSelectedRadioButtonValue(groupBoxGender);

if (string.IsNullOrEmpty(gender))
{
MessageBox.Show("性別を選択してください。");
return;
}

foreachで選択値を取得するメソッドが空文字を返すようにしておけば、未選択チェックが簡単になります。

C#
private string GetSelectedRadioButtonValue(GroupBox groupBox)
{
foreach (Control control in groupBox.Controls)
{
if (control is RadioButton radioButton && radioButton.Checked)
{
return radioButton.Tag?.ToString() ?? radioButton.Text;
}
}

return "";
}

入力フォームでは、ラジオボタンの値を取得する前に、未選択の場合の処理を考えておくことが大切です。

5. ラジオボタンの初期値を設定する方法

5-1. デザイナーで初期選択を設定する

C#のWinFormsでは、Visual Studioのフォームデザイナーからラジオボタンの初期選択を設定できます。

初期状態で選択しておきたいラジオボタンを選び、プロパティウィンドウでCheckedTrueに設定します。

たとえば、「回答しない」を初期選択にしたい場合は、radioButtonOtherCheckedTrueにします。

C#
radioButtonOther.Checked = true;

デザイナーで設定した内容は、自動生成コードに反映されます。フォームを表示したときに、そのラジオボタンが最初から選択された状態になります。

5-2. フォーム表示時にCheckedをtrueにする

コードで初期値を設定する場合は、フォームのコンストラクタやLoadイベントでCheckedtrueにします。

C#
public Form1()
{
InitializeComponent();

radioButtonOther.Checked = true;
}

または、Form_Loadで設定します。

C#
private void Form1_Load(object sender, EventArgs e)
{
radioButtonOther.Checked = true;
}

どちらでも初期選択は可能ですが、画面の初期状態として設定するだけであれば、InitializeComponent()の後に書く方法が分かりやすいです。

5-3. 条件に応じて初期値を切り替える方法

実務では、ユーザー情報や設定値に応じて初期選択を切り替えたい場合があります。

たとえば、データベースから取得した性別コードによって初期値を設定する場合は、次のように書けます。

C#
string genderCode = "F";

if (genderCode == "M")
{
radioButtonMale.Checked = true;
}
else if (genderCode == "F")
{
radioButtonFemale.Checked = true;
}
else
{
radioButtonOther.Checked = true;
}

switch文を使うと、さらに見やすく書けます。

C#
string genderCode = "F";

switch (genderCode)
{
case "M":
radioButtonMale.Checked = true;
break;

case "F":
radioButtonFemale.Checked = true;
break;

default:
radioButtonOther.Checked = true;
break;
}

ラジオボタンの初期値は、画面を開いた時点でユーザーにとって自然な選択になっているかを考えて設定しましょう。

5-4. 初期値が反映されないときの確認ポイント

ラジオボタンの初期値が思った通りに反映されない場合は、次の点を確認します。

まず、InitializeComponent()より前にCheckedを設定していないか確認します。

C#
public Form1()
{
radioButtonMale.Checked = true; // これは避ける
InitializeComponent();
}

コントロールはInitializeComponent()で作成されるため、その前に操作すると正しく動作しません。基本的には次のように書きます。

C#
public Form1()
{
InitializeComponent();
radioButtonMale.Checked = true;
}

次に、同じグループ内で複数のラジオボタンにChecked = trueを設定していないか確認します。

同じグループ内では1つしか選択できないため、最後にtrueを設定したものが選択されることがあります。

C#
radioButtonMale.Checked = true;
radioButtonFemale.Checked = true; // 最終的にこちらが選択される

また、Loadイベントや他のイベントで後から別のラジオボタンを選択していないかも確認しましょう。

6. ラジオボタンのイベント処理

6-1. CheckedChangedイベントの基本

ラジオボタンの選択状態が変わったときに処理を実行したい場合は、CheckedChangedイベントを使います。

C#
private void radioButtonMale_CheckedChanged(object sender, EventArgs e)
{
if (radioButtonMale.Checked)
{
MessageBox.Show("男性が選択されました");
}
}

Visual Studioのフォームデザイナーでは、ラジオボタンをダブルクリックするとイベントハンドラが自動作成されます。

また、コードでイベントを登録することもできます。

C#
radioButtonMale.CheckedChanged += radioButtonMale_CheckedChanged;

6-2. 選択が変わったタイミングで処理を実行する

ラジオボタンの選択が変わったタイミングで、画面表示や内部値を更新することができます。

C#
private void radioButtonPayment_CheckedChanged(object sender, EventArgs e)
{
if (radioButtonCash.Checked)
{
labelDescription.Text = "現金でお支払いください。";
}
else if (radioButtonCard.Checked)
{
labelDescription.Text = "カード情報を入力してください。";
}
else if (radioButtonEmoney.Checked)
{
labelDescription.Text = "電子マネーを選択してください。";
}
}

ただし、CheckedChangedは選択されたときだけでなく、選択が外れたときにも発生します。そのため、処理を実行する前にCheckedtrueかどうかを確認するのが基本です。

C#
private void radioButtonCard_CheckedChanged(object sender, EventArgs e)
{
if (!radioButtonCard.Checked)
{
return;
}

labelDescription.Text = "カード情報を入力してください。";
}

6-3. 選択内容に応じて表示や入力項目を切り替える

ラジオボタンは、選択内容に応じて入力項目を切り替える場合にもよく使われます。

たとえば、支払い方法で「クレジットカード」が選ばれた場合だけ、カード番号の入力欄を有効にする例です。

C#
private void radioButtonCard_CheckedChanged(object sender, EventArgs e)
{
textBoxCardNumber.Enabled = radioButtonCard.Checked;
}

複数のラジオボタンで同じイベント処理を使うこともできます。

C#
private void PaymentRadioButton_CheckedChanged(object sender, EventArgs e)
{
textBoxCardNumber.Enabled = radioButtonCard.Checked;
textBoxEmoneyId.Enabled = radioButtonEmoney.Checked;
}

イベントの登録は次のようにします。

C#
radioButtonCash.CheckedChanged += PaymentRadioButton_CheckedChanged;
radioButtonCard.CheckedChanged += PaymentRadioButton_CheckedChanged;
radioButtonEmoney.CheckedChanged += PaymentRadioButton_CheckedChanged;

このように共通イベントにまとめると、処理の重複を減らせます。

6-4. イベントが2回発生したように見える理由

ラジオボタンのCheckedChangedイベントを使っていると、「イベントが2回発生している」と感じることがあります。

これは、同じグループ内で選択が切り替わると、次の2つの変化が起きるためです。

C#
以前選択されていたラジオボタンのCheckedがfalseになる
新しく選択されたラジオボタンのCheckedがtrueになる

どちらもCheckedChangedなので、イベントが複数回発生したように見えます。

そのため、イベント処理の中では、必ずCheckedtrueのときだけ処理するようにします。

C#
private void RadioButton_CheckedChanged(object sender, EventArgs e)
{
RadioButton radioButton = sender as RadioButton;

if (radioButton == null || !radioButton.Checked)
{
return;
}

MessageBox.Show(radioButton.Text + "が選択されました");
}

この書き方にすると、選択が外れたタイミングでは処理を行わず、新しく選択されたラジオボタンだけを対象にできます。

6-5. イベント処理を書くときの注意点

ラジオボタンのイベント処理では、次の点に注意しましょう。

まず、CheckedChangedの中で別のラジオボタンのCheckedを変更すると、さらにイベントが発生することがあります。処理が複雑になると、意図しない動作の原因になります。

C#
private void radioButtonMale_CheckedChanged(object sender, EventArgs e)
{
radioButtonFemale.Checked = false;
}

通常、同じグループ内であれば他のラジオボタンは自動的に未選択になるため、このような処理は不要です。

また、初期値を設定したタイミングでもCheckedChangedが発生する場合があります。初期表示時とユーザー操作時で処理を分けたい場合は、フラグを使う方法があります。

C#
private bool isInitializing = true;

private void Form1_Load(object sender, EventArgs e)
{
radioButtonOther.Checked = true;
isInitializing = false;
}

private void radioButtonOther_CheckedChanged(object sender, EventArgs e)
{
if (isInitializing)
{
return;
}

if (radioButtonOther.Checked)
{
MessageBox.Show("選択が変更されました");
}
}

イベント処理は便利ですが、書きすぎると画面の動きが追いづらくなるため、必要な処理だけを分かりやすく書くことが大切です。

7. 実践例:ラジオボタンを使った簡単な入力フォーム

7-1. 性別・区分・支払い方法などの選択UIを作る

ここでは、C#のラジオボタンを使って、簡単な入力フォームを作る例を考えます。

画面には次の項目があるとします。

C#
性別:男性 / 女性 / 回答しない
会員区分:一般 / プレミアム
支払い方法:現金 / クレジットカード / 電子マネー

それぞれのグループは、別々のGroupBoxに入れておきます。

C#
groupBoxGender
groupBoxMemberType
groupBoxPayment

各ラジオボタンには、表示用のTextと内部値用のTagを設定します。

C#
radioButtonMale.Text = "男性";
radioButtonMale.Tag = "M";

radioButtonFemale.Text = "女性";
radioButtonFemale.Tag = "F";

radioButtonOther.Text = "回答しない";
radioButtonOther.Tag = "N";

支払い方法も同じように設定します。

C#
radioButtonCash.Text = "現金";
radioButtonCash.Tag = "cash";

radioButtonCard.Text = "クレジットカード";
radioButtonCard.Tag = "card";

radioButtonEmoney.Text = "電子マネー";
radioButtonEmoney.Tag = "emoney";

7-2. 選択値を取得してメッセージに表示する

登録ボタンを押したときに、選択された値を取得して表示する例です。

C#
private void buttonSubmit_Click(object sender, EventArgs e)
{
string gender = GetSelectedRadioButtonValue(groupBoxGender);
string memberType = GetSelectedRadioButtonValue(groupBoxMemberType);
string payment = GetSelectedRadioButtonValue(groupBoxPayment);

MessageBox.Show(
$"性別:{gender}\n会員区分:{memberType}\n支払い方法:{payment}"
);
}

共通メソッドは次のようにしておきます。

C#
private string GetSelectedRadioButtonValue(GroupBox groupBox)
{
foreach (Control control in groupBox.Controls)
{
if (control is RadioButton radioButton && radioButton.Checked)
{
return radioButton.Tag?.ToString() ?? radioButton.Text;
}
}

return "";
}

この方法にしておくと、グループが増えても同じメソッドで選択値を取得できます。

7-3. 初期値と入力チェックを組み合わせる

入力フォームでは、初期値を設定する項目と、ユーザーに必ず選ばせる項目を分けて考えることが重要です。

たとえば、会員区分は「一般」を初期選択にしておきます。

C#
private void Form1_Load(object sender, EventArgs e)
{
radioButtonGeneral.Checked = true;
}

一方、支払い方法はユーザーに選ばせたいので、初期値を設定しないこともあります。

登録ボタンを押したときには、未選択チェックを行います。

C#
private void buttonSubmit_Click(object sender, EventArgs e)
{
string payment = GetSelectedRadioButtonValue(groupBoxPayment);

if (string.IsNullOrEmpty(payment))
{
MessageBox.Show("支払い方法を選択してください。");
return;
}

MessageBox.Show("登録しました。");
}

初期選択を設定するかどうかは、業務ルールやユーザーの誤入力リスクに応じて決めましょう。

7-4. 実務で使いやすいコード例

実務では、選択値の取得、未選択チェック、表示名の取得などを共通化しておくと便利です。

C#
private RadioButton GetSelectedRadioButton(GroupBox groupBox)
{
foreach (Control control in groupBox.Controls)
{
if (control is RadioButton radioButton && radioButton.Checked)
{
return radioButton;
}
}

return null;
}

このメソッドを使うと、TextTagも必要に応じて取得できます。

C#
private void buttonSubmit_Click(object sender, EventArgs e)
{
RadioButton selectedGender = GetSelectedRadioButton(groupBoxGender);
RadioButton selectedPayment = GetSelectedRadioButton(groupBoxPayment);

if (selectedGender == null)
{
MessageBox.Show("性別を選択してください。");
return;
}

if (selectedPayment == null)
{
MessageBox.Show("支払い方法を選択してください。");
return;
}

string genderText = selectedGender.Text;
string genderValue = selectedGender.Tag?.ToString() ?? "";

string paymentText = selectedPayment.Text;
string paymentValue = selectedPayment.Tag?.ToString() ?? "";

MessageBox.Show(
$"性別:{genderText}({genderValue})\n" +
$"支払い方法:{paymentText}({paymentValue})"
);
}

RadioButtonそのものを返すようにすると、表示文字、内部値、有効状態などを柔軟に扱えます。

8. WPFでラジオボタンを使う場合の基本

8-1. WinFormsとWPFのRadioButtonの違い

C#でWPFアプリを作る場合も、ラジオボタンを使えます。ただし、WinFormsとは書き方が異なります。

WinFormsでは、主にフォームデザイナーやコードでRadioButtonを配置します。一方、WPFではXAMLで画面を定義するのが一般的です。

WinFormsでは選択状態をCheckedで取得しますが、WPFではIsCheckedを使います。

WinFormsの例です。

C#
if (radioButtonMale.Checked)
{
// 選択されている
}

WPFの例です。

C#
if (radioButtonMale.IsChecked == true)
{
// 選択されている
}

WPFのIsCheckedbool?型のため、trueと比較して判定する書き方がよく使われます。

8-2. IsCheckedで選択状態を取得する

WPFでラジオボタンを定義する例です。

XML
<RadioButton x:Name="radioButtonMale" Content="男性" />
<RadioButton x:Name="radioButtonFemale" Content="女性" />
<RadioButton x:Name="radioButtonOther" Content="回答しない" />

選択状態を取得するには、C#側でIsCheckedを確認します。

C#
string gender = "";

if (radioButtonMale.IsChecked == true)
{
gender = "男性";
}
else if (radioButtonFemale.IsChecked == true)
{
gender = "女性";
}
else if (radioButtonOther.IsChecked == true)
{
gender = "回答しない";
}

WinFormsのCheckedと似ていますが、WPFではIsChecked == trueと書く点に注意しましょう。

8-3. GroupNameでグループ化する

WPFでは、GroupNameを使ってラジオボタンをグループ化できます。

XML
<RadioButton Content="男性" GroupName="Gender" />
<RadioButton Content="女性" GroupName="Gender" />
<RadioButton Content="回答しない" GroupName="Gender" />

<RadioButton Content="現金" GroupName="Payment" />
<RadioButton Content="クレジットカード" GroupName="Payment" />
<RadioButton Content="電子マネー" GroupName="Payment" />

同じGroupNameを持つラジオボタン同士は、1つだけ選択されます。

WinFormsでは親コンテナでグループを分けるのが基本ですが、WPFではGroupNameで明示的にグループを分けられるため、画面構造と選択グループを分けて考えやすくなります。

8-4. Checkedイベントを使った処理

WPFでも、ラジオボタンが選択されたタイミングで処理を実行できます。

XAMLでイベントを指定します。

XML
<RadioButton
x:Name="radioButtonCard"
Content="クレジットカード"
GroupName="Payment"
Checked="radioButtonCard_Checked" />

C#側では次のように書きます。

C#
private void radioButtonCard_Checked(object sender, RoutedEventArgs e)
{
textBoxCardNumber.IsEnabled = true;
}

複数のラジオボタンで共通のイベントを使うこともできます。

XML
<RadioButton Content="現金" GroupName="Payment" Checked="Payment_Checked" />
<RadioButton Content="クレジットカード" GroupName="Payment" Checked="Payment_Checked" />
<RadioButton Content="電子マネー" GroupName="Payment" Checked="Payment_Checked" />
C#
private void Payment_Checked(object sender, RoutedEventArgs e)
{
if (sender is RadioButton radioButton)
{
MessageBox.Show(radioButton.Content.ToString());
}
}

8-5. バインディングで選択値を扱う考え方

WPFでは、画面部品を直接操作するだけでなく、バインディングを使って選択値を扱うことがよくあります。

たとえば、ViewModelに選択値を持たせます。

C#
public string SelectedPayment { get; set; }

実務では、ラジオボタンの選択状態とプロパティを変換して扱うことが多く、MVVMパターンではコンバーターやEnumを組み合わせる場合もあります。

WPFでは、単純な画面ならIsCheckedで十分ですが、画面が複雑になる場合は、選択値をViewModel側で管理する設計にすると保守しやすくなります。

9. ラジオボタンでよくあるエラー・つまずき

9-1. 複数選択できてしまう原因

ラジオボタンなのに複数選択できてしまう場合、グループが分かれている可能性があります。

WinFormsでは、異なる親コンテナに入っているラジオボタンは別グループとして扱われます。

たとえば、次のように配置されていると、それぞれ別グループになります。

C#
groupBoxA
- radioButton1

groupBoxB
- radioButton2

同じ選択肢として1つだけ選ばせたい場合は、同じGroupBoxや同じPanelの中に配置してください。

9-2. 選択値が取得できない原因

選択値が取得できない場合は、まずCheckedを確認している対象が正しいかを見直します。

よくある原因は、次のようなものです。

C#
別のラジオボタンを参照している
GroupBoxの中ではなくフォーム全体を探している
Tagが設定されていない
イベントが登録されていない

GroupBoxの中にあるラジオボタンを探す場合は、必ず対象のGroupBox.Controlsを調べます。

C#
foreach (Control control in groupBoxGender.Controls)
{
if (control is RadioButton radioButton && radioButton.Checked)
{
return radioButton.Text;
}
}

もしTagを使っている場合は、Tagnullではないかも確認しましょう。

C#
string value = radioButton.Tag?.ToString() ?? "";

9-3. 初期値が思った通りに設定されない原因

初期値が反映されない場合は、設定するタイミングとグループの状態を確認します。

特に多いのは、次のようなケースです。

C#
InitializeComponentより前にCheckedを設定している
同じグループ内で複数のCheckedをtrueにしている
Loadイベントで別の値に上書きしている
デザイナー設定とコード設定が競合している

基本的には、InitializeComponent()の後に1つだけChecked = trueを設定します。

C#
public Form1()
{
InitializeComponent();

radioButtonGeneral.Checked = true;
}

デザイナーとコードの両方で初期値を設定している場合は、どちらの設定が最終的に有効になるのかを確認しましょう。

9-4. イベントが発火しない原因

ラジオボタンのイベントが発火しない場合は、イベントハンドラが正しく登録されているか確認します。

デザイナーで設定している場合は、プロパティウィンドウのイベント一覧を確認します。

コードで登録する場合は、次のように書かれているか確認します。

C#
radioButtonMale.CheckedChanged += radioButtonMale_CheckedChanged;

また、すでに選択済みのラジオボタンをもう一度クリックしても、Checkedの値が変わらないため、CheckedChangedは発生しません。

CheckedChangedは、あくまで選択状態が変わったときに発生するイベントです。

9-5. Name・Text・Tagの使い分けで混乱する場合

ラジオボタンを使うとき、NameTextTagの使い分けで混乱することがあります。

基本的には、次のように考えると分かりやすいです。

Nameは、プログラム上で部品を識別するための名前です。

C#
radioButtonMale

Textは、画面に表示する文字です。

C#
男性

Tagは、プログラム内部で使う値です。

C#
M

たとえば、次のように設定します。

C#
radioButtonMale.Name = "radioButtonMale";
radioButtonMale.Text = "男性";
radioButtonMale.Tag = "M";

表示文言を変更する可能性がある場合は、処理の判定にTextを使うよりも、Tagを使う方が安全です。

10. C#のラジオボタンを使うときのベストプラクティス

10-1. 選択肢は短くわかりやすい文言にする

ラジオボタンの選択肢は、短く分かりやすい文言にすることが大切です。

たとえば、次のような文言は分かりやすいです。

C#
現金
クレジットカード
電子マネー

一方で、説明文が長すぎると画面が読みにくくなります。補足説明が必要な場合は、ラベルや説明文を別に表示するとよいでしょう。

C#
クレジットカード
カード番号と有効期限の入力が必要です。

ラジオボタンは、選択肢そのものを見てすぐ理解できることが重要です。

10-2. 初期選択を設定すべきケースとしないケース

ラジオボタンには初期選択を設定できますが、必ず設定すればよいわけではありません。

たとえば、「表示件数」「並び順」「検索条件」など、標準値が明確なものは初期選択を設定すると便利です。

C#
radioButtonSortNew.Checked = true;

一方で、ユーザーに明示的に選ばせたい重要な項目では、あえて初期選択を設定しない場合もあります。

たとえば、契約内容や支払い方法など、誤って初期値のまま登録されると困る項目では、未選択チェックを入れる設計が向いています。

C#
if (string.IsNullOrEmpty(payment))
{
MessageBox.Show("支払い方法を選択してください。");
return;
}

初期選択を設定するかどうかは、ユーザーの入力ミスを防げるかどうかを基準に考えましょう。

10-3. 値の管理にはTagやEnumを活用する

ラジオボタンの値を管理するときは、Textだけに頼らず、TagEnumを活用すると保守しやすくなります。

Tagを使う例です。

C#
radioButtonCash.Tag = "cash";
radioButtonCard.Tag = "card";
radioButtonEmoney.Tag = "emoney";

Enumを使う場合は、次のように定義できます。

C#
public enum PaymentType
{
Cash,
Card,
Emoney
}

ラジオボタンにEnum値を設定することもできます。

C#
radioButtonCash.Tag = PaymentType.Cash;
radioButtonCard.Tag = PaymentType.Card;
radioButtonEmoney.Tag = PaymentType.Emoney;

取得するときは次のようにします。

C#
PaymentType paymentType = (PaymentType)selectedRadioButton.Tag;

Enumを使うと、文字列の入力ミスを防ぎやすくなります。実務では、固定の選択肢を扱う場合に特に有効です。

10-4. グループ単位で取得処理を共通化する

ラジオボタンの選択値を取得する処理は、グループ単位で共通化しておくと便利です。

C#
private RadioButton GetSelectedRadioButton(Control parent)
{
foreach (Control control in parent.Controls)
{
if (control is RadioButton radioButton && radioButton.Checked)
{
return radioButton;
}
}

return null;
}

GroupBoxだけでなくPanelにも対応したい場合は、引数をControlにしておくと使いやすくなります。

C#
RadioButton selected = GetSelectedRadioButton(groupBoxPayment);

if (selected != null)
{
string value = selected.Tag?.ToString() ?? selected.Text;
}

ただし、コンテナの中にさらに別のコンテナがある場合は、再帰的に探す必要があります。単純な画面では、ラジオボタンを同じ階層に配置しておくと処理が簡単です。

10-5. 保守しやすいラジオボタン処理の書き方

保守しやすいラジオボタン処理を書くためには、画面表示、選択値、判定処理を分けて考えることが大切です。

避けたい書き方は、表示文字で直接判定する方法です。

C#
if (radioButton.Text == "クレジットカード")
{
// 処理
}

この書き方だと、表示文言を「カード払い」に変更したときに処理が動かなくなる可能性があります。

代わりに、TagやEnumを使います。

C#
if (radioButton.Tag?.ToString() == "card")
{
// 処理
}

また、イベント処理に多くのロジックを書きすぎないことも重要です。

C#
private void Payment_CheckedChanged(object sender, EventArgs e)
{
UpdatePaymentInputState();
}

実際の処理は別メソッドに分けます。

C#
private void UpdatePaymentInputState()
{
textBoxCardNumber.Enabled = radioButtonCard.Checked;
textBoxEmoneyId.Enabled = radioButtonEmoney.Checked;
}

このようにしておくと、初期表示時にも同じ処理を呼び出せます。

C#
private void Form1_Load(object sender, EventArgs e)
{
radioButtonCash.Checked = true;
UpdatePaymentInputState();
}

ラジオボタンはシンプルな部品ですが、入力フォームでは頻繁に使われます。最初から共通化や値の管理を意識しておくと、後から画面項目が増えたときにも対応しやすくなります。

まとめ

C#のラジオボタンは、複数の選択肢から1つだけ選ばせたい場合に使う基本的なUI部品です。WinFormsではRadioButtonコントロールを使い、選択状態はCheckedプロパティで判定します。

ラジオボタンを使うときは、同じグループ内では1つだけ選択される仕組みを理解しておくことが重要です。WinFormsでは、GroupBoxPanelなどの親コンテナを分けることで、複数のラジオボタングループを作れます。

選択値を取得する方法には、if文で個別に判定する方法、foreachでグループ内を探す方法、Tagプロパティを使って内部値を管理する方法があります。選択肢が少ない場合はif文でも問題ありませんが、実務ではTagやEnumを活用すると保守しやすくなります。

初期値を設定するには、デザイナーでCheckedTrueにするか、フォーム表示時にコードでChecked = trueを設定します。ただし、ユーザーに明示的に選ばせたい項目では、あえて初期値を設定せず、未選択チェックを行う設計も有効です。

イベント処理では、CheckedChangedを使うことで、選択が変わったタイミングで処理を実行できます。ただし、選択が外れたときにもイベントが発生するため、Checkedtrueかどうかを確認してから処理するのが基本です。

WPFでは、CheckedではなくIsCheckedを使い、グループ化にはGroupNameを使います。WinFormsとは書き方が異なりますが、「複数の選択肢から1つだけ選ぶ」という考え方は同じです。

C#でラジオボタンを扱うときは、選択肢のグループ化、選択値の取得、初期値設定、イベント処理を正しく理解しておくことで、使いやすく保守しやすい入力フォームを作れるようになります。