列头添加复选框(这个方法试过-列数不多可以用)
第一:添加列标题时,添加两个空格——用于显示复选框;
第二:实现列标题添加复选框,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| private void AddCheckeBoxToDGVHeader(DataGridView dgv) { for (int i = 0; i < this.dgvList.Columns.Count; i++) { System.Windows.Forms.CheckBox ckBox = new System.Windows.Forms.CheckBox(); ckBox.Checked = true; System.Drawing.Rectangle rect = dgv.GetCellDisplayRectangle(i, -1, false); ckBox.Size = new System.Drawing.Size(25, 25); ckBox.Location = rect.Location; ckBox.Padding = new System.Windows.Forms.Padding(2, 6, 0, 0); ckBox.BackColor = Color.Transparent; ckBox.Name = dgv.Columns[i].Name; ckBox.CheckedChanged += new EventHandler(ckBox_CheckedChanged); dgv.Controls.Add(ckBox); } } void ckBox_CheckedChanged(object sender, EventArgs e) { CheckBox chb = sender as CheckBox; MessageBox.Show("Test=="+ chb.Name); }
|
运行效果:
在dataGridView表格中插入复选框
1 2 3 4 5
| DataGridViewColumn myCol = new DataGridViewCheckBoxColumn(); myCol.Name = "SelBox"; myCol.HeaderText = "字段行的值"; dataGridView1.Columns.Insert(0, myCol);
|
C#DataGridViewCheckBoxColumn用法
实现功能:
点击单元格实现checkbox的勾选,点击头标题实现全选和非全选,记录选中的行数 (注意:this.dataList.RefreshEdit();//否则可能不全选)
增加一列复选框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| DataGridViewCheckBoxColumn columncb = new DataGridViewCheckBoxColumn();
private void FrmAddOrder_Load(object sender, EventArgs e) {
this.dataList.DataSource = dataSource_NoOrder;
columncb.FlatStyle = FlatStyle.Standard; columncb.HeaderText = "👆全选"; columncb.Name = "cb_check"; columncb.TrueValue = true; columncb.FalseValue = false; columncb.DataPropertyName = "IsChecked";
dataList.Columns.Insert(0, columncb);
}
bool headCkBoxIsChecked = false;
private void dataList_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
if (e.RowIndex == -1 && !headCkBoxIsChecked && e.ColumnIndex == 0) { for (int i = 0; i < dataList.Rows.Count; i++) { this.dataList.Rows[i].Cells["cb_check"].Value = true; } headCkBoxIsChecked = true; columncb.HeaderText = "✋ 已全选"; } else if (e.RowIndex == -1 && headCkBoxIsChecked && e.ColumnIndex == 0 ) { for (int i = 0; i < dataList.Rows.Count; i++) { this.dataList.Rows[i].Cells[0].Value = false;
} headCkBoxIsChecked = false; columncb.HeaderText = "👆 全选"; } else if(e.ColumnIndex == 0) { if ((bool)dataList.Rows[e.RowIndex].Cells["cb_check"].EditedFormattedValue == true) { this.dataList.Rows[e.RowIndex].Cells["cb_check"].Value = false; } else { this.dataList.Rows[e.RowIndex].Cells["cb_check"].Value = true; }
} this.dataList.RefreshEdit();
selectNum = 0; for (int i = 0; i < this.dataList.Rows.Count; i++) { if ((bool)dataList.Rows[i].Cells["cb_check"].EditedFormattedValue) { selectNum += 1; } } this.lbNum.Text = string.Format("{0} ", selectNum);
}
|
一个单元格添加CheckBox
把 DataGridViewCheckBoxCell 实例放在指定的单元格里
如
1 2
| var chk = new DataGridViewCheckBoxCell(); dataGridView1.Rows[0].Cells[0] = chk;
|
DataGridView控件列头添加CheckBox
DataGridView控件是CS架构中用的比较频繁的一个控件,里面提供了checkbox列的功能,可是却没有在列头给出checkbox控件用于全选/全部取消所有行的功能,确实是个遗憾,这里就通过绘制实现这个功能.
添加一个帮助类
添加一个帮助类DataGridViewCheckBoxHeaderCell,用于绘制列头checkbox和创建鼠标单击事件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| public class DataGridViewCheckBoxHeaderCell : DataGridViewColumnHeaderCell { public delegate void DataGridViewCheckBoxHeaderEventHander(object sender, DataGridViewCheckBoxHeaderEventArgs e);
private Point checkBoxLocation; private Size checkBoxSize; private bool _checked = false; private Point _cellLocation = new Point();
private System.Windows.Forms.VisualStyles.CheckBoxState _cbState = System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal;
public event DataGridViewCheckBoxHeaderEventHander OnCheckBoxClicked;
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; 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;
DataGridViewCheckBoxHeaderEventArgs ex = new DataGridViewCheckBoxHeaderEventArgs(); ex.CheckedState = _checked;
object sender = new object();
if (OnCheckBoxClicked != null) { OnCheckBoxClicked(sender, ex); this.DataGridView.InvalidateCell(this); } } base.OnMouseClick(e); } }
public class DataGridViewCheckBoxHeaderEventArgs : EventArgs { private bool checkedState;
public bool CheckedState { get { return checkedState; } set { checkedState = value; } } }
|
代码使用
在有DataGridView的界面,添加代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private void AddCheckboxCell() { DataGridViewCheckBoxHeaderCell ch = new DataGridViewCheckBoxHeaderCell(); ch.OnCheckBoxClicked += new DataGridViewCheckBoxHeaderCell.DataGridViewCheckBoxHeaderEventHander(ch_OnCheckBoxClicked); DataGridViewCheckBoxColumn checkboxCol = new DataGridViewCheckBoxColumn(); checkboxCol.HeaderCell = ch; checkboxCol.HeaderCell.Value = string.Empty; this.dgvSelectAll.Columns.Insert(0, checkboxCol); } void ch_OnCheckBoxClicked(object sender, DataGridViewCheckBoxHeaderEventArgs e) { foreach (DataGridViewRow dgvRow in this.dgvSelectAll.Rows) { dgvRow.Cells[0].Value = e.CheckedState; } this.dgvSelectAll.RefreshEdit(); }
|
在DataGridView手动添加了CheckBox列;在窗体Show的时候,遇到一个错误:
**错误如下: **
- DataGridView中发生一下异常:System.FormatException:单元格的Formatted值的类型错误.要替换此默认对话框,请处理DataError事件.
点击以后有一对话框错误如下:
DataGridView中发生一下异常:
SystemArgumentException:为DataGridViewCheckBoxCell提供的值的类型错误.
在System.Windows.Forms.DataGridViewCheckBoxCell.set_EditiingCellFormattedValue(Object value)
在System.Windows.Forms.DataGridView.InitializeEditingCellValue (DataGridViewCessStyle&dataGridViewCellStyle,DataGridViewCell&dataGridViewCell)
要替换此默认对话框,请处理DataError事件.
我之前曾经用过CheckBox列,此次和之前的区别是 AllowUserToAddRows=true;
我将该属性设置为false,错误没有出现,可以确定该错误与系统自动添加的行及checBox的默认值为null有关。
我在DefaultValuesNeeded事件中增加了默认值,发现错误依旧。
仔细研究发现如下两种解决方法:
其一:在CellFormatting事件中处理
1 2 3 4 5 6 7 8
| { if (this.dataGridView1.Columns[e.ColumnIndex].Name == "AZK") { if (e.Value == null) e.Value = false; }
}
|
其二:在在CellFormatting事件中不处理,但DataError事件中处理
1 2 3 4
| { if (dataGridView1.Rows[e.RowIndex].IsNewRow) return; }
|
Note: DataGridView中几个事件发生的顺序记录如下,以备查寻
在AllowUserToAddRows=true时候的事件发生次序
1
| Form.Show ---> CellFormatting (如果出错,goto DataError),注意这里的NewRow没有触发DefaultValuesNeeded事件。
|
如果发生其他比如 RowEnter事件
1 2 3 4 5
| (DefaultValuesNeeded) ---> RowEnter ---> CellClick
(DefaultValuesNeeded) ---> RowsAdded ---> UserAddedRow
DefaultValuesNeeded事件不会发生在 IsNewRow=true的row上
|
相关链接(侵删)
- DateGridView标题列头添加复选框
- C#在dataGridView表格中插入复选框
- C#DataGridViewCheckBoxColumn用法(刷新操作,否则点击之后可能不能立即勾选)
- 如何在DataGridView中的某一个单元格添加CheckBox?
- C# winform单元格的formatted值的类型错误 DataGridView中CheckBox列运行时候System.FormatException异常
=================我是分割线=================
欢迎到公众号来唠嗑: