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