實現(xiàn)效果
點擊checkBox1或者直接在第一列列表頭點擊即可實現(xiàn)
代碼實現(xiàn)
我的datagridview叫dgv
我在datagridview已經(jīng)默認添加了一個DataGridViewCheckBoxColumn,勾選時value為1,不勾選時value為0
第一種通過可視化拖動一個checkBox來實現(xiàn)
拖動組件,然后綁定事件
點擊事件
事件代碼:
/// <summary>
/// checkbox1的點擊事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void checkSelectAll_CheckedChanged(object sender, EventArgs e)
{
if (checkSelectAll.Checked)
{
foreach (DataGridViewRow dgvRow in this.dgv.Rows)
{
dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = true;
}
}
else
{
foreach (DataGridViewRow dgvRow in this.dgv.Rows)
{
dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = false;
}
}
}
第二種,自定義checkBox,添加到列頭
這種需要自己弄一個DataGridViewCheckBoxColumn
文件位置
詳細代碼:
==DatagridviewCheckboxHeaderCell ==
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp20230728.Properties;
namespace WindowsFormsApp20230728
{
//定義觸發(fā)單擊事件的委托
public delegate void DatagridviewcheckboxHeaderEventHander(object sender, DatagridviewCheckboxHeaderEventArgs e);
//定義繼承于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);
if (p.X >= checkBoxLocation.X && p.X <= checkBoxLocation.X + checkBoxSize.Width
&& p.Y >= checkBoxLocation.Y && p.Y <= checkBoxLocation.Y + checkBoxSize.Height)
{
_checked = !_checked;
//獲取列頭checkbox的選擇狀態(tài)
DatagridviewCheckboxHeaderEventArgs ex = new DatagridviewCheckboxHeaderEventArgs { CheckedState = _checked };
var sender = new object();//此處不代表選擇的列頭checkbox,只是作為參數(shù)傳遞。應(yīng)該列頭checkbox是繪制出來的,無法獲得它的實例
if (OnCheckBoxClicked != null)
{
OnCheckBoxClicked(sender, ex);//觸發(fā)單擊事件
this.DataGridView.InvalidateCell(this);
}
}
base.OnMouseClick(e);
}
}
}
==DatagridviewCheckboxHeaderEventArgs ==
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace WindowsFormsApp20230728
{
//定義包含列頭checkbox選擇狀態(tài)的參數(shù)類
public class DatagridviewCheckboxHeaderEventArgs : EventArgs
{
public DatagridviewCheckboxHeaderEventArgs()
{
CheckedState = false;
}
public bool CheckedState
{
get { return _CheckedState; }
set { _CheckedState = value; }
}
private bool _CheckedState;
}
}
實現(xiàn)位置,均在Form2類中
代碼:
public Form2()
{
InitializeComponent();
//InitColumnInfo();
#region 自定義組件開始
//自定義組件實現(xiàn)
var ch = new DatagridviewCheckboxHeaderCell();
ch.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);
var checkboxCol = this.dgv.Columns[0] as DataGridViewCheckBoxColumn;
checkboxCol.HeaderCell = ch;
checkboxCol.HeaderCell.Value = string.Empty;
}
注意其中dgv.EndEdit(); 失去焦點操作,如果沒有這個,你焦點所在checkBox不會勾選
//去除datagridview列表頭排序
// foreach (DataGridViewColumn item in dgv.Columns)
// item.SortMode = DataGridViewColumnSortMode.NotSortable;
/// <summary>
/// 單擊事件
/// </summary>
private void ch_OnCheckBoxClicked(object sender, DatagridviewCheckboxHeaderEventArgs e)
{
//失去焦點操作
dgv.EndEdit();
//Console.WriteLine(e.CheckedState.ToString());
//選中事件操作
if (e.CheckedState)
{
for(int i = 0; i < dgv.Rows.Count; i++)
{
dgv.Rows[i].Cells[0].Value = 1;
}
//foreach (DataGridViewRow dgvRow in this.dgv.Rows)
//{
// dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = true;
//}
}
else
{
for (int i = 0; i < dgv.Rows.Count; i++)
{
dgv.Rows[i].Cells[0].Value = 0;
}
//foreach (DataGridViewRow dgvRow in this.dgv.Rows)
//{
// dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = 0;
//}
}
}
第三種,不添加DataGridViewCheckBoxColumn,直接以自定義的形式形成一列的checkBox
和第二種相比,就是把DataGridViewCheckBoxColumn從DataGridView中刪除,然后public Form2()自定義組件實現(xiàn)代碼改一下,其他都是一樣的
也就是把這一串換成下面的即可
//自定義組件實現(xiàn)
var ch = new DatagridviewCheckboxHeaderCell();
ch.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);
var checkboxCol = this.dgv.Columns[0] as DataGridViewCheckBoxColumn;
checkboxCol.HeaderCell = ch;
checkboxCol.HeaderCell.Value = string.Empty;
if (!this.DesignMode){
DatagridviewCheckboxHeaderCell cbHeader = new DatagridviewCheckboxHeaderCell();
cbHeader.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);
DataGridViewCheckBoxColumn checkboxCol = new DataGridViewCheckBoxColumn();
checkboxCol.HeaderCell = cbHeader;
checkboxCol.HeaderCell.Value = string.Empty;
this.dgv.Columns.Insert(0,checkboxCol);
}
第三種實現(xiàn)的是類屬于java面向?qū)ο缶幊痰男Ч诙N則是自定義組件進行添加的效果
參考文章
C# Winform中DataGridView的DataGridViewCheckBoxColumn CheckBox選中判斷
關(guān)于Winform中DatagridView 表頭checkBox全選選項框總結(jié)
DataGridView EndEdit()方法
c# winform獲取gridview數(shù)據(jù)
精髓概括
C# 自定義控件實現(xiàn)ChackBox的Checked效果
-
創(chuàng)建一個類,繼承自System.Windows.Forms.Control,實現(xiàn)自定義控件;
-
在類中重寫OnPaint方法,繪制CheckBox的外觀;
-
在類中重寫OnMouseDown方法,實現(xiàn)鼠標點擊時CheckBox的Checked狀態(tài)的改變;
-
在類中定義一個Checked屬性,用于獲取或設(shè)置CheckBox的Checked狀態(tài);
-
在類中定義一個CheckedChanged事件,用于在CheckBox的Checked狀態(tài)改變時觸發(fā);
-
在類中重寫OnClick方法,實現(xiàn)CheckBox的Checked狀態(tài)改變時觸發(fā)CheckedChanged事件。文章來源:http://www.zghlxwxcb.cn/news/detail-639830.html
配套功能實現(xiàn)
Winform中DatagridView 加上 ContextMenuStrip 實現(xiàn)右鍵點擊展示菜單,且可以獲取數(shù)據(jù)(在沒數(shù)據(jù)的地方不顯示右鍵菜單,以及右鍵焦點進行改變),詳情見該欄上一篇文章文章來源地址http://www.zghlxwxcb.cn/news/detail-639830.html
到了這里,關(guān)于Winform中DatagridView 表頭實現(xiàn)一個加上一個checkBox,實現(xiàn)全選選項功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!