关于Winform中DatagridView表头checkBox全选选项框总结
背景:
因为⼯作原因,⼿上的项⽬都是多年⽼程序,使⽤的VS2010,winform开发。所以做些的项⽬稍稍有些棘⼿,好多东西需要查下资料,并过去总结,还因为时间久远,发现很多⽹上资料东⼀榔头西⼀耙⼦,资料难,难以总结。所以留下这个痕迹,给⾃⼰和需要的码友以借鉴。
表头CheckBox
已办做C/S端,和前端有关系的你就避免不了做表格,避免不了使⽤DatagridView 。如果没什么特别要求,也就绑定下数据就⾏了:this.dataGridView1.DataSource=具体的百度⼀下,这个还是有的。
然⽽,如果只是查看这就解决了,但是有时需要都数据进⾏修改,删除,这些需要选择表格内容的操作,就需要多⼀步操作,如果只是单选也不⽤那麽复杂,但是既然选择了,肯定会考虑到多选,尽然考虑到多选,就肯定考虑到全选,所以。。。要么不做,要么做全。
如图,Datagridview ⾃带DataGridViewCheckBoxColumn 将需要选择的⾏设置成这个属性,会⾃动⽣成多选项选择框。这⼀步很简单。
关键是啊表头如何设置成这个多选框。
这个⼩⽅框的制作需要考虑;⽅案有两个:
⽅案⼀
单独使⽤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);
}
/// <summary>
/// 点击列头checkbox单击事件
/// </summary>
protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
{
{
var p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y);
datasource是什么意思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;
/// <summary>
/// 单击事件
/// </summary>
private void ch_OnCheckBoxClicked(object sender, DatagridviewCheckboxHeaderEventArgs e)
{
//选中事件操作
}
可以撒花了。到这就可以直接使⽤了,复制粘贴就能⽤。
留下点痕迹,给以后回头看的⾃⼰。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。