2012年03月04日

.NETでチェックボックス同士を連動

今回はチェックボックス同士を連動させてみます。絵にするとこちら。
CheckBox.png
「全て」をチェックすると「項目1」〜「項目3」のチェックが切り替わります。また、「項目1」〜「項目3」をチェックすると「全て」のチェックが切り替わります。さらに、「全て」のチェックボックスはThree State(オン、オフ、中間の3状態)です。わりとよくありそうなパターンです。

こいつを素直にCheckedChangedイベントハンドラに実装するとうまくいきません。「全て」が変わったら「項目1」が変わって、「項目1」が変わったら「全て」が変わって、と連鎖してしまい、おかしなことになります。なのでCheckedChangedではなくClickを使いましょう。Clickイベントは、ユーザーがチェックボックスを触ったときだけ発生します。プログラムでチェック状態を変えたときには発生しません。都合がいいですね。ちなみに、スペースキーを押してチェックを変えてもClickイベントが発生します。サンプルはこちら。

Clickイベントによるチェックボックス連動
//めぼしいプロパティの設定(実際はデザイナで設定)
checkBoxAll.AutoCheck = false;
checkBoxAll.ThreeState = true;

//「全て」チェックボックスのClickイベントハンドラ
private void checkBoxAll_Click(object sender, EventArgs e)
{
checkBoxAll.Checked = !checkBoxAll.Checked;
checkBox1.Checked = checkBoxAll.Checked;
checkBox2.Checked = checkBoxAll.Checked;
checkBox3.Checked = checkBoxAll.Checked;
}

//「項目1」〜「項目3」チェックボックスのClickイベントハンドラ
private void checkBox_Click(object sender, EventArgs e)
{
if (checkBox1.Checked && checkBox2.Checked && checkBox3.Checked)
{
//全部チェックされてたら「全て」をオンにする。
checkBoxAll.CheckState = CheckState.Checked;
}
else if (!checkBox1.Checked && !checkBox2.Checked && !checkBox3.Checked)
{
//全部チェックされてなかったら「全て」をオフにする。
checkBoxAll.CheckState = CheckState.Unchecked;
}
else
{
//中途半端にチェックされてたら「全て」を中間状態にする。
checkBoxAll.CheckState = CheckState.Indeterminate;
}
}


もう一つのコツとしては、AutoCheckプロパティをfalseにしていることです。というのも、ユーザーが「全て」を触るときはオンまたはオフの2値ですが、プログラムが「全て」を触るときはオン、オフ、中間の3値になります。なので「全て」のチェック状態をプログラムで制御する必要があります。とはいっても、「全て」のClickイベントハンドラ内の
checkBoxAll.Checked = !checkBoxAll.Checked;
の1行だけです。







ラベル:.net
posted by ぺるたご at 00:51| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。