ラジオ、チェックボックスのCheckedChangedの注意

2014/05/14

Windowsフォームアプリケーションで、よくラジオボタンやチェックボックスなどのインターフェイスが見られます。

これらの用途は、スイッチやフラグのように主に切り替えなどに使われます。

C#で実装する際、radioButtonかcheckBoxを設置後、CheckedChangedメソッドで呼び出すことができます。


これは、ラジオボタンまたはチェックボックスの、チェックがついたか消えたかの変化があった場合に呼ばれます。

ここで注意が必要なのは、このCheckedChangedメソッドが、クリックされた時以外でも呼ばれるということです。


つまり、コード内で「.Checked」の値を変更させるプログラムを書くと、
そこを通り、「.Checked」の値が変化された時も、CheckedChangedメソッドが呼ばれるのです。


以前私はこのようなソースコードを作成したのですが、上記の特性のおかげでフラグ管理がぐちゃぐちゃになりました笑


private void Form_Load(object sender, EventArgs e)
{
        //フォームがロードされた時
        //チェックボックスの状態をフラグで管理している
        if (Form1.doShutdown == false) checkBox.Checked = false;
        else checkBox1.Checked = true;
}

//_Loadで.checkedの値を変更しているので、checkBox_CheckedChangedが呼ばれてしまう

private void checkBox_CheckedChanged(object sender, EventArgs e)
{
        //ここでチェックの状態が反対になる。
        //以降、フォームを呼ばれるたびに
        //フラグが切り替わってしまうロジックになってしまっている
        if (Form1.doShutdown == false) Form1.doShutdown = true;
        else Form1.doShutdown = false;
}



これではしょうがないので、
CheckedChangedではなく、Clickメソッドを使い、回避します。

Clickは、書いてある通りクリックされた時しか呼ばれないので、上記のLoadメソッドを通過しても呼ばれません。


private void checkBox_Click(object sender, EventArgs e)
{
        if (Form1.doShutdown == false) Form1.doShutdown = true;
        else Form1.doShutdown = false;
}



以上、
ラジオボタン、チェックボックスを使う際の、CheckedChangedメソッドの注意でした。