今天一羣裏有人問到這個功能,其實應該挺簡單,但提問題的人問題的出發點並無描述清楚。所以,一個簡簡單單的需求,就引發了羣內熱烈的討論。下面看看這個功能如何去實現,先上效果:spa
下面直接上代碼,請不要在乎控件的名稱以及Text屬性:code
public Form6() { InitializeComponent(); foreach (CheckBox ck in groupBox1.Controls) { ck.CheckedChanged += Ck_CheckedChanged; } } private void checkBox1_Click(object sender, EventArgs e) { if (checkBox1.CheckState == CheckState.Checked) { foreach (CheckBox ck in groupBox1.Controls) ck.Checked = true; checkBox1.Text = "反選"; } else { foreach (CheckBox ck in groupBox1.Controls) ck.Checked = false; checkBox1.Text = "全選"; } } private void Ck_CheckedChanged(object sender, EventArgs e) { CheckBox c = sender as CheckBox; if (c.Checked == true) { foreach (CheckBox ch in groupBox1.Controls) { if (ch.Checked == false) return; } checkBox1.Checked = true; checkBox1.Text = "反選"; } else { checkBox1.Checked = false; checkBox1.Text = "全選"; } }
接下來要說的是,關於全選CheckBox事件的選取。最初,該同窗提的問題是:有沒有遇到過按鈕點擊沒反應?但隨着羣裏你們一人一嘴的提示,該同窗漸漸把本身的需求給提出來了,他的代碼是用「全選」CheckBox的CheckChanged事件中去修改「子選項」裏面的6個CheckBox選中狀態。然而,他又想到:若是不是點「全選」CheckBox,而是下面6個CheckBox挨個點,上面那個全選的狀態怎麼改。因而該同窗又給下面六個CheckBox分別註冊了CheckChanged事件,去判斷並修改全選CheckBox的狀態。最終,致使了他所謂的事件嵌套,跳不出來了。orm
其實放棄使用全選的CheckChanged事件,選用Click事件就能夠解決掉全選的兩個Check屬性更改的來源:1是來自本身的點擊更改狀態,2.是來自子選項中全部checkbox都選中,間接致使的全選。沒有總結,僅做記錄。blog