libro
www.tuyano.com
初心者のためのC#プログラミング入門

さまざまなコントロールの利用 (2/4)

作成:2013-08-31 09:26
更新:2013-08-31 09:34

■RadioButtonとGroupBox

続いて、「ラジオボタン」です。ラジオボタンは、「RadioButton」というクラスとして用意されています。これも、基本的な使い方はCheckBoxと同じです。Textで表示するテキストを設定し、Checkedで選択状態を取得し、CheckedChangedイベントで状態が変更された時のイベント処理を行います。

ただし、ラジオボタンには、チェックボックスとは決定的に違う点があります。それは、「常に複数のラジオボタンがグループとして用意される」という点です。ラジオボタンは、いくつかある項目から1つを選ぶためのものですから、「どれとどれの中から1つを選ぶのか」ということがわからないといけません。

単にRadioButtonFormに配置しただけの場合、配置したすべてのRadioButtonはまとめて1つのグループとして扱われます。つまり「あるものすべての中から1つを選ぶ」という動作になるのです。が、これでは複数のグループを作れませんから、明示的にRadioButtonをひとつのグループとして作成するべきでしょう。


■グループ化のための「Panel」「GroupBox」
これには「Panel」や「GroupBox」といったコントロールを使います。Panelは、部品を自身の中に組み込むことのできる透明なコンテナです。画面には何も表示されません。これに対し、GroupBoxは、直線で周辺部を囲まれたコンテナです。よくラジオボタンを表示するのに用いられますので、一目見れば「ああ、これか」とわかるでしょう。

これらのコンテナは、Controlsプロパティを持っており、これにAddすることでコントロールを自身の中に組み込むことができます。こうしてPanelGroupBoxに組み込まれたRadioButtonは、そこに組み込まれているものだけが1つの独立したグループとして働くようになります。

では、実際の利用例を下にあげておきましょう。ここでは「male」「fimale」というラジオボタンを作成しています。クリックすると、選択されているラジボタンのテキストが表示されます。


■senderとキャストについて
今回のサンプルでは、クリックしたラジオボタンを取り出しし利用するのに以下のようなやり方をしています。
RadioButton btn = (RadioButton)sender;
label.Text = "selected: " + btn.Text;
イベント用メソッドの引数として渡されるsenderは、objectというクラスのインスタンスで、これがイベントの発生したオブジェクトになります。「なぜ、RadioButtonインスタンスじゃないのか?」というと、イベントというのは特定のコントロールでのみ発生するわけではないからです。どんなコントロールにそのイベント用メソッドが割り当てられているかわかりません。そこで、イベントが発生したインスタンスを、スーパークラスであるobjectに変換して渡すようにしているのです。

C#などのプログラミング言語では、値にはタイプ(型)が決まっています。この型を別の型に変換することを「キャスト(型変換)」と呼びます。オブジェクトの場合も、キャストによりスーパークラスのインスタンスに変換したり、また元のクラスに戻したりすることができます。つまり、

RadioButtonでイベントが発生!
・発生したRadioButtonインスタンスをobjectにキャストしてイベント用メソッドに渡す。

こういうことを行っていたのですね。後は、受け取ったobjectインスタンスを、元のRadioButtonインスタンスにキャストして戻せばいいわけです。これを行っているのが(RadioButton)senderという部分です。

値や変数の前に()でキャストしたいタイプやクラスを指定すると、その値にキャストすることができます。(RadioButton)senderと記述することで、変数senderのオブジェクトをRadioButtonインスタンスにキャストして取り出すことができる、というわけです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

using System;
using System.Drawing;
using System.Windows.Forms;

namespace MyFrmApp
{
    public class MyForm : Form
    {
        private Label label;
        RadioButton radio1, radio2;
        
        public MyForm()
        {
            this.Width = 300;
            this.Height = 200;
            setupControls();
        }
        
        public void setupControls()
        {
            label = new Label();
            label.Text = "type text:";
            label.Font = new Font("Geneva",12,FontStyle.Regular);
            label.Height = 30;
            label.Width = 300;
            this.Controls.Add(label);
            GroupBox group = new GroupBox();
            group.Width = 200;
            group.Height = 100;
            group.Top = 50;
            group.Left = 50;
            group.Text = "radio group";
            this.Controls.Add(group);
            radio1 = new RadioButton();
            radio1.Text = "male";
            radio1.Top = 25;
            radio1.Left = 25;
            radio1.Checked = true;
            radio1.CheckedChanged += check_changed;
            group.Controls.Add(radio1);
            radio2 = new RadioButton();
            radio2.Text = "fimale";
            radio2.Top = 50;
            radio2.Left = 25;
            radio2.CheckedChanged += check_changed;
            group.Controls.Add(radio2);
        }
        
        private void check_changed(object sender, System.EventArgs e)
        {
            RadioButton btn = (RadioButton)sender;
            label.Text = "selected: " + btn.Text;
        }
    }
}

※関連コンテンツ

「初心者のためのC#プログラミング入門」に戻る