zoukankan      html  css  js  c++  java
  • DataGridView列头checkbox 分类: .NET 20130313 14:09 1343人阅读 评论(0) 收藏

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace WinformOperateDataGridView
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void 查询_Click(object sender, EventArgs e)
            {
                DataTable dtTemp = new DataTable();
     
                using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=123456;database=test;"))
                {
                    SqlDataAdapter sa = new SqlDataAdapter("select * from test", con);
                    sa.Fill(dtTemp);
                }
                this.dataGridView1.DataSource = dtTemp;
    
                //创建复选框列   
                DataGridViewCheckBoxColumn checkboxCol = new DataGridViewCheckBoxColumn();
                //创建复选框列头单元格
                datagridviewCheckboxHeaderCell ch = new datagridviewCheckboxHeaderCell();
                //设置复选框那列的单元格为复选框
                checkboxCol.HeaderCell = ch;
                
                //将此复选框列添加到DataGridView中
                this.dataGridView1.Columns.Add(checkboxCol);
    
                ch.OnCheckBoxClicked += new datagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);//关联单击事件
    
            }
    
            private void ch_OnCheckBoxClicked(object sender, datagridviewCheckboxHeaderEventArgs e)
            {
                 foreach (DataGridViewRow dgvRow in this.dataGridView1.Rows)
                 {
                     if (e.CheckedState)
                     {
                         dgvRow.Cells[2].Value = true;
                     }
                     else
                     {
                         dgvRow.Cells[2].Value = false;
                     }
                 }
             }
        }
        //定义触发单击事件的委托
        delegate void datagridviewcheckboxHeaderEventHander(object sender, datagridviewCheckboxHeaderEventArgs e);
        class datagridviewCheckboxHeaderEventArgs : EventArgs
        {
            private bool checkedState = false;
     
            public bool CheckedState
            {
                get { return checkedState; }
                set { checkedState = value; }
            }
         }
        class datagridviewCheckboxHeaderCell : DataGridViewColumnHeaderCell
         {
             Point checkBoxLocation;
             Size checkBoxSize;
             bool _checked = false;
             Point _cellLocation = new Point();
             System.Windows.Forms.VisualStyles.CheckBoxState _cbState =
                 System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal;
             public event datagridviewcheckboxHeaderEventHander OnCheckBoxClicked;
     
     
             //绘制列头checkbox
             protected override void Paint(System.Drawing.Graphics graphics,
                System.Drawing.Rectangle clipBounds,
                System.Drawing.Rectangle cellBounds,
                int rowIndex,
                DataGridViewElementStates dataGridViewElementState,
                object value,
                object formattedValue,
                string errorText,
                DataGridViewCellStyle cellStyle,
                DataGridViewAdvancedBorderStyle advancedBorderStyle,
                DataGridViewPaintParts paintParts)
             {
                 base.Paint(graphics, clipBounds, cellBounds, rowIndex,
                     dataGridViewElementState, value,
                     formattedValue, errorText, cellStyle,
                     advancedBorderStyle, paintParts);
                 Point p = new Point();
                 Size s = CheckBoxRenderer.GetGlyphSize(graphics,
                 System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
                 p.X = cellBounds.Location.X +
                     (cellBounds.Width / 2) - (s.Width / 2) - 1;//列头checkbox的X坐标
                 p.Y = cellBounds.Location.Y +
                     (cellBounds.Height / 2) - (s.Height / 2);//列头checkbox的Y坐标
                 _cellLocation = cellBounds.Location;
                 checkBoxLocation = p;
                 checkBoxSize = s;
                 if (_checked)
                     _cbState = System.Windows.Forms.VisualStyles.
                         CheckBoxState.CheckedNormal;
                 else
                     _cbState = System.Windows.Forms.VisualStyles.
                         CheckBoxState.UncheckedNormal;
                 CheckBoxRenderer.DrawCheckBox
                 (graphics, checkBoxLocation, _cbState);
             }
     
     
     
             /// <summary>
             /// 点击列头checkbox单击事件
             /// </summary>
             protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
             {
     
                 Point p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y);
                 if (p.X >= checkBoxLocation.X && p.X <=
                     checkBoxLocation.X + checkBoxSize.Width
                 && p.Y >= checkBoxLocation.Y && p.Y <=
                     checkBoxLocation.Y + checkBoxSize.Height)
                 {
                     _checked = !_checked;
     
     
                     //获取列头checkbox的选择状态
                     datagridviewCheckboxHeaderEventArgs ex = new datagridviewCheckboxHeaderEventArgs();
                     ex.CheckedState = _checked;
     
                     object sender = new object();//此处不代表选择的列头checkbox,只是作为参数传递。应该列头checkbox是绘制出来的,无法获得它的实例
     
                     if (OnCheckBoxClicked != null)
                     {
                         OnCheckBoxClicked(sender, ex);//触发单击事件
                         this.DataGridView.InvalidateCell(this);
                     }
     
                 }
                 base.OnMouseClick(e);
             }
     
         }
        
    }
    


    PS:有的网友在MS SQL数据库里添加bit类型的字段,这个是没有必要的。

    参考地址:http://blog.csdn.net/zhiguo2010/article/details/5747161

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    如何在VS2013中进行Boost单元测试
    C++项目中的extern "C" {}(转)
    C/C++语言中NULL、'’和0的区别
    关于C++“加、减机制”的整理
    C++继承中的public/protected/private
    Systemc在VC++2010安装方法及如何在VC++2010运行Noxim模拟器
    Testbench(转)
    Java高级特性之泛型
    Java高级特性之反射
    Java 输入输出流
  • 原文地址:https://www.cnblogs.com/configman/p/4657567.html
Copyright © 2011-2022 走看看