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) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

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