1. 程式人生 > >DataGridView複選框全選和全不選

DataGridView複選框全選和全不選

      今天測試的又提新的要求了,說是我的第一列的複選框不能全選活著全部取消,這樣會影響使用者的使用效果。測試的提了要求,那就改吧,但是中間還經歷了一些小挫折,這裡給大家分享一下。哈哈。

       因為.net framework自帶的Datagridview自身的這個控制元件是沒有咱們平時用的全選全不選的複選框的,他的表頭就只有這一列的名稱,開始思路走的有點彎了,於是就想畫一個得了,於是在晚上找了一篇部落格。http://www.cnblogs.com/gossip/archive/2008/11/22/1338868.html ,但是畫的途中發現了好多的問題,於是又放棄了畫一個文字框的想法。 

       後來就在表頭放了一個CheckBox,全選都好實現,但是實現到咱們用的程度,還真是費了點勁。

 private void chkIn_CheckedChanged(object sender, EventArgs e)
 {
       //全選的複選框選中
       if (chkIn.Checked == true)
       {     
            //選中全部
            for (int i = 0; i < this.DGVInBogie.Rows.Count; i++)
            {
                 this.DGVInBogie.Rows[i].Cells["S_Choice"].Value = true;
            }


        }
        全選的複選框取消
        else
        {    
             //全部取消
             for (int i = 0; i < DGVInBogie.Rows.Count; i++)
             {
                 this.DGVInBogie.Rows[i].Cells["S_Choice"].Value = false;
             }
        }
 }

     上邊的程式碼是全選或者全部取消,重點是下邊的程式碼
private int countOut;      
private void DGVInBogie_CellContentClick(object sender, DataGridViewCellEventArgs e)
 {
      countOut = 0;
      string ck = string.Empty;
      //計算選中了多少條資料
      for (int i = 0; i < DGVInBogie.Rows.Count; i++)
      {
           ck = this.DGVInBogie.Rows[i].Cells["S_Choice"].EditedFormattedValue.ToString();

           if (ck == "True")
           {
                    countOut++;
            }
      }
      
      //如果都選中,全選的複選框選中
      if (countOut == DGVInBogie.Rows.Count)
      {
           chkIn.Checked = true;
      }
      
      //如果沒有全選中,則取消全選複選框。
      if (countOut != DGVInBogie.Rows.Count)
      {
           chkIn.CheckedChanged -= new EventHandler(chkIn_CheckedChanged);
           chkIn.Checked = false;
           chkIn.CheckedChanged += new EventHandler(chkIn_CheckedChanged);
      }
}
       這個程式碼就是我們如果全部選擇,但是有一行資料我們不需要,我們取消的話,全選的複選框也取消。其中
 chkIn.CheckedChanged -= new EventHandler(chkIn_CheckedChanged);
chkIn.Checked = false;
 chkIn.CheckedChanged += new EventHandler(chkIn_CheckedChanged);
        其中這三行的程式碼就是先取消這個發生的時間,然後再將複選框狀態為不選中,然後重新開始這個時間,也可以理解成先不要這方法了,然後執行完第二行的程式碼,在要這個程式碼。