今天一群里有人問到這個功能,其實應該挺簡單,但提問題的人問題的出發點並沒有描述清楚。因此,一個簡簡單單的需求,就引起了群內熱烈的討論。下面看看這個功能如何去實現,先上效果:
下面直接上代碼,請不要在意控件的名稱以及Text屬性:
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的狀態。最終,導致了他所謂的事件嵌套,跳不出來了。
其實放棄使用全選的CheckChanged事件,選用Click事件就可以解決掉全選的兩個Check屬性更改的來源:1是來自自己的點擊更改狀態,2.是來自子選項中所有checkbox都選中,間接導致的全選。沒有總結,僅作記錄。