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


    今天一群里有人問到這個功能,其實應該挺簡單,但提問題的人問題的出發點並沒有描述清楚。因此,一個簡簡單單的需求,就引起了群內熱烈的討論。下面看看這個功能如何去實現,先上效果:

 

下面直接上代碼,請不要在意控件的名稱以及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都選中,間接導致的全選。沒有總結,僅作記錄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM