关于Winform中DatagridView 表头checkBox全选选项框总结

背景:
因为工作原因,手上的项目都是多年老程序,使用的VS2010,winform开发。所以做些的项目稍稍有些棘手,好多东西需要查找下资料,并过去总结,还因为时间久远,发现很多网上资料东一榔头西一耙子,资料难找,难以总结。所以留下这个痕迹,给自己和需要的码友以借鉴。

表头CheckBox

已办做C/S端,和前端有关系的你就避免不了做表格,避免不了使用DatagridView 。如果没什么特别要求,也就绑定下数据就行了:this.dataGridView1.DataSource=???具体的百度一下,这个还是有的。
然而,如果只是查看这就解决了,但是有时需要都数据进行修改,删除,这些需要选择表格内容的操作,就需要多一步操作,如果只是单选也不用那麽复杂,但是既然选择了,肯定会考虑到多选,尽然考虑到多选,就肯定考虑到全选,所以。。。要么不做,要么做全。
在这里插入图片描述关于Winform中DatagridView 表头checkBox全选选项框总结_第1张图片

如图,Datagridview 自带DataGridViewCheckBoxColumn 将需要选择的行设置成这个属性,会自动生成多选项选择框。这一步很简单。
关键是啊表头如何设置成这个多选框。
关于Winform中DatagridView 表头checkBox全选选项框总结_第2张图片
这个小方框的制作需要考虑;方案有两个:

方案一

单独使用checkBox 控件直接放在红色位置,,然后使用checkBox选中事件,对列表中的数据遍历选中。
优点是:难度小,速度快,适合界面固定的表格
缺点是:一旦界面放大或缩小,checkBox位置会错乱,不会跟着表格界面发生变化。

方案二

重点说下方案二,这是个一劳永逸的方法。做一个组件类,重画表格:优点是:做好之后所有使用到的地方都适用。
缺点是:有点难。
上肘子:

	//定义触发单击事件的委托
	public delegate void DatagridviewcheckboxHeaderEventHander(object sender, DatagridviewCheckboxHeaderEventArgs e);
	//定义包含列头checkbox选择状态的参数类
	public class DatagridviewCheckboxHeaderEventArgs : EventArgs
	{
		public DatagridviewCheckboxHeaderEventArgs()
    		{
       		 CheckedState = false;
    		}
    		public bool CheckedState { get; set; }
	}
	//定义继承于DataGridViewColumnHeaderCell的类,用于绘制checkbox,定义checkbox鼠标单击事件
	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 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);
    }
    /// 
    /// 点击列头checkbox单击事件
    /// 
    protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
    {
    	var 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的选择状态
        var ex = new DatagridviewCheckboxHeaderEventArgs { CheckedState = _checked };
        var sender = new object();//此处不代表选择的列头checkbox,只是作为参数传递。应该列头checkbox是绘制出来的,无法获得它的实例
       if (OnCheckBoxClicked != null)
            {
                OnCheckBoxClicked(sender, ex);//触发单击事件
                this.DataGridView.InvalidateCell(this);
            }
           }
        base.OnMouseClick(e);
        }

这些代码我是直接放在 public partial class XDataGridView : DataGridView
组件内的,重写表格,可以合并单元格什么的都可以在这里操作。这里就不详说了。
这边表头就可以直接显示多选框了,使用的时候如下:

var ch = new DatagridviewCheckboxHeaderCell();
       ch.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);
        var checkboxCol = this.dataGridView1.Columns[0] as DataGridViewCheckBoxColumn;
        checkboxCol.HeaderCell = ch;
        checkboxCol.HeaderCell.Value = string.Empty;
        /// 
        /// 单击事件
        /// 
        private void ch_OnCheckBoxClicked(object sender, DatagridviewCheckboxHeaderEventArgs e)
        {
           //选中事件操作
        }

可以撒花了。到这就可以直接使用了,复制粘贴就能用。
留下点痕迹,给以后回头看的自己。
{因为代码没法完全上贴,所以搞了个案例上传了,大家可以去参考下}

你可能感兴趣的:(c#,c#)