Introduction
This article will explains about creating & displaying Column Header CheckBox in winforms DataGridView.
Background
Bydefault DataGridView doen't supports column header chekbox, for this we need to write a class which is inherited by DataGridViewColumnHeaderCell class.
1) Add a boolean propery named CheckAll in that class to maintain the seleced state of Header checkbox.
2) override default implemention of Paint method. In this method, drawing the CheckBox at column Header.
3) override its OnMouseClick event. Here handle the click event of header checkbox.
I have created class named DGVColumnHeader as follows...
class DGVColumnHeader : DataGridViewColumnHeaderCell
{
private Rectangle CheckBoxRegion;
private bool checkAll = false;
protected override void Paint(Graphics graphics,
Rectangle clipBounds, 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);
graphics.FillRectangle(new SolidBrush(cellStyle.BackColor), cellBounds);
CheckBoxRegion = new Rectangle(
cellBounds.Location.X + 1,
cellBounds.Location.Y + 2,
25, cellBounds.Size.Height - 4);
if (this.checkAll)
ControlPaint.DrawCheckBox(graphics, CheckBoxRegion, ButtonState.Checked);
else
ControlPaint.DrawCheckBox(graphics, CheckBoxRegion, ButtonState.Normal);
Rectangle normalRegion =
new Rectangle(
cellBounds.Location.X + 1 + 25,
cellBounds.Location.Y,
cellBounds.Size.Width - 26,
cellBounds.Size.Height);
graphics.DrawString(value.ToString(), cellStyle.Font, new SolidBrush(cellStyle.ForeColor), normalRegion);
}
protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
{
Rectangle rec = new Rectangle(new Point(0, 0), this.CheckBoxRegion.Size);
this.checkAll = !this.checkAll;
if (rec.Contains(e.Location))
{
this.DataGridView.Invalidate();
}
base.OnMouseClick(e);
}
public bool CheckAll
{
get { return this.checkAll; }
set { this.checkAll = value; }
}
}
First Initialize a object of DGVColumnHeader add to DataGridView columns using Insert method at desired place. In this example i have added at first column and assigned to HeaderCell of it.
DGVColumnHeader dgvColumnHeader;
private void Form1_Load(object sender, EventArgs e)
{
dgvColumnHeader = new DGVColumnHeader();
dataGridView1.Columns.Insert(0, new DataGridViewCheckBoxColumn());
dataGridView1.Columns[0].HeaderCell = dgvColumnHeader;
DataTable dt = new DataTable();
dt.Columns.Add("1");
dt.Columns.Add("2");
dt.Rows.Add("100", "101");
dt.Rows.Add("102", "103");
dataGridView1.DataSource = dt;
}
Add the following code in dataGridView1_ColumnHeaderMouseClick event to check/uncheck all the records based on the header checkbox state
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex == 0)
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Cells[0].Value = dgvColumnHeader.CheckAll;
}
}
}
When we select any of checkbox cell other than Header checkbox, by default grid will shows as edit mode. This we can handle using dataGridView1_CellClick event
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0)
{
for (int i = 0; i < this.dataGridView1.RowCount; i++)
{
this.dataGridView1.EndEdit();
string re_value = this.dataGridView1.Rows[i].Cells[0].EditedFormattedValue.ToString();
this.dataGridView1.Rows[i].Cells[0].Value = "true";
}
}
}