datagridview表头全选

参与程序http://www.codeproject.com/KB/grid/CheckBoxHeaderCell.aspx 这里老外写的一个控件,他少了委托重载的一个方法。先写一个控件

 

public delegate void CheckBoxClickedHandler(bool state);

        public class DataGridViewCheckBoxHeaderCellEventArgs : EventArgs

        {

            bool _bChecked;

            public DataGridViewCheckBoxHeaderCellEventArgs(bool bChecked)

            {

                _bChecked = bChecked;

            }

            public bool Checked

            {

                get { return _bChecked; }

            }

        }





        public 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 CheckBoxClickedHandler OnCheckBoxClicked;



            public DatagridViewCheckBoxHeaderCell()

            {

            }



            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);

                p.Y = cellBounds.Location.Y +

                    (cellBounds.Height / 2) - (s.Height / 2);

                _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);

            }



            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;

                    if (OnCheckBoxClicked != null)

                    {

                        OnCheckBoxClicked(_checked);

                        this.DataGridView.InvalidateCell(this);

                    }



                }

                base.OnMouseClick(e);

            }

        

    }

 

  然后在前台做个窗体,加个datagridview控件,加个几行,注意datagirdview有编辑状态,如果只有一行又是在编辑状态,就不起作用了。当然一般全选控件不可能在编辑状态

 public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }



        private void Form1_Load(object sender, EventArgs e)

        {

            //DataGridViewCheckBoxColumn colCB = new DataGridViewCheckBoxColumn();

            DatagridViewCheckBoxHeaderCell cbHeader = new DatagridViewCheckBoxHeaderCell();

            //colCB.HeaderCell = cbHeader;

            //dataGridView1.Columns.Add(colCB);

            cbHeader.Value = string.Empty;

            cbHeader.OnCheckBoxClicked += new CheckBoxClickedHandler(cbHeader_OnCheckBoxClicked);



            dataGridView1.Columns[0].HeaderCell = cbHeader;

        }



        private void cbHeader_OnCheckBoxClicked(bool state)

        {        
              //这一句很重要结束编辑状态
        dgvWarn.EndEdit();
            if (dataGridView1.Rows.Count > 0)

            {

                for (int i = 0; i < dataGridView1.Rows.Count; i++)

                {

                    dataGridView1.Rows[i].Cells[0].Value = state;

                }

            }

        }

    }

  datagridview表头全选

 

你可能感兴趣的:(datagridview)