DataGridView复选框全选和全不选

      今天测试的又提新的要求了,说是个人第一列的复选框不能全选活着所有取消,这样会影响用户的使用效果。测试的提了要求,那就改吧,可是中间还经历了一些小挫折,这里给你们分享一下。哈哈。html

       由于.net framework自带的Datagridview自身的这个控件是没有我们平时用的全选全不选的复选框的,他的表头就只有这一列的名称,开始思路走的有点弯了,因而就想画一个得了,因而在晚上找了一篇博客。http://www.cnblogs.com/gossip/archive/2008/11/22/1338868.html ,可是画的途中发现了好多的问题,因而又放弃了画一个文本框的想法。 测试

       后来就在表头放了一个CheckBox,全选都好实现,可是实现到我们用的程度,还真是费了点劲。this

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);
        其中这三行的代码就是先取消这个发生的时间,而后再将复选框状态为不选中,而后从新开始这个时间,也能够理解成先不要这方法了,而后执行完第二行的代码,在要这个代码。