この章では、ラジオボタンを使ってみます。
RadioButtonクラスの継承関係は、ボタンやチェックボックスと同じです。
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Windows.Forms.Control
System.Windows.Forms.ButtonBase
System.Windows.Forms.RadioButton
さて、ラジオボタンはグループ内では、ただ一つしかチェックすることができません。
同一のフォームに作られたラジオボタンはすべて、同一のグループとなります。じゃあ、複数のグループを作るにはどうしたらいいの??という疑問がわくでしょう。
簡単な解決方法は、グループごとに別々のラベルコントロールを作って、その上にラジオボタンをのせます。
また、チェックを変更すると必ずCheckedChangedイベントが2つ発生します。
これは、Aにチェックをついているときに、Bにチェックをつけると、AのCheckedプロパティの値と、BのCheckedプロパティの値が変わるからです。
では、簡単なサンプルを見てみましょう。
このサンプルではControl.ControlCollection.AddRangeメソッドを利用して、ラジオボタンを親フォームの子コントロールに追加しています。
public virtual void AddRange ( Control[] controls )これは、Addメソッドが一つ一つのコントロールを追加していたのに対し、まとめて追加します。Addメソッドについては第15章を参照してください。
// radio01.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class radio01
{
static int nNo = 6;
static RadioButton[] rb = new RadioButton[nNo];
static string[] str = new string[]
{"国語", "数学", "理科", "社会", "英語", "音楽"};
static Label label;
public static void Main()
{
MyForm mf = new MyForm();
for (int i = 0; i < nNo; i++)
{
rb[i] = new RadioButton();
rb[i].Text = str[i];
rb[i].Location = new Point(10, 10 + i * rb[0].Height);
rb[i].CheckedChanged += new EventHandler(radio_CheckedChanged);
}
mf.Controls.AddRange(rb);
label = new Label();
label.Parent = mf;
label.Location = new Point(10, 20 + nNo * rb[0].Height);
label.Width = mf.ClientSize.Width;
Application.Run(mf);
}
static void radio_CheckedChanged(object sender, EventArgs e)
{
bool bEx = false;
for (int i = 0; i < nNo; i++)
{
if ((RadioButton)sender == rb[i] && rb[i].Checked == true)
{
label.Text = str[i] + "が選択されています";
bEx = true;
}
if (bEx)
break;
}
}
}
class MyForm : Form
{
public MyForm()
{
Text = "猫でもわかるC#プログラミング";
BackColor = SystemColors.Window;
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
DialogResult dr;
dr = MessageBox.Show("本当に終了してもよろしいですか",
"猫C#",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);
if (dr == DialogResult.Yes)
e.Cancel = false;
else
e.Cancel = true;
}
}
CheckedChangedイベントが発生したら、rb[0]から順番に送り元を調べていますが、一致したら、それ以上調べてもムダなのでforループを抜けるようにしています。実行結果は次のようになります。
Update 19/Nov/2006 By Y.Kumei