第35章 ラジオボタンを使ってみる


この章では、ラジオボタンを使ってみます。



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ループを抜けるようにしています。

実行結果は次のようになります。




[C# フォーム Index] [C# コンソール Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 19/Nov/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。