C# WinForm中實現CheckBox全選反選功能

    今天一羣裏有人問到這個功能,其實應該挺簡單,但提問題的人問題的出發點並無描述清楚。所以,一個簡簡單單的需求,就引發了羣內熱烈的討論。下面看看這個功能如何去實現,先上效果: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

相關文章
相關標籤/搜索