How to Place CheckBox in Header Cell of WinForms GridGroupingControl?
Checkbox in header cell
A CheckBox can be placed in a header cell of the WinForms GridGroupingControl by handling the QueryCellStyleInfo event.
void gridGroupingControl1_QueryCellStyleInfo(object sender, GridTableCellStyleInfoEventArgs e)
{
// Checks whether the cell is a header cell and if the column name is "Column2"
if (e.TableCellIdentity.TableCellType == GridTableCellType.ColumnHeaderCell &&
e.TableCellIdentity.Column.Name == "Column2")
{
e.Style.CellType = "CheckBox";
e.Style.CellValueType = typeof(bool);
e.Style.CellValue = CheckBoxValue;
e.Style.ReadOnly = false;
e.Style.CellAppearance = GridCellAppearance.Raised;
e.Style.Enabled = true;
}
e.Handled = true;Private Sub gridGroupingControl1_QueryCellStyleInfo(ByVal sender As Object, ByVal e As GridTableCellStyleInfoEventArgs)
'Checks whether the cell is header cell or not
If e.TableCellIdentity.TableCellType = GridTableCellType.ColumnHeaderCell AndAlso e.TableCellIdentity.Column.Name = "Column2" Then
e.Style.CellType = "CheckBox"
e.Style.CellValueType = GetType(Boolean)
e.Style.CellValue = CheckBoxValue
e.Style.ReadOnly = False
e.Style.CellAppearance = GridCellAppearance.Raised
e.Style.Enabled = True
End If
e.Handled = True
End SubBy default, the selected cell’s MouseController calls the Cellrenderer’s MouseUp that in turn raises the CheckBoxClick. The DragGroupHeader MouseController for the header cells does not call the Renderer’s MouseUp. So you have to explicitly call the Renderer’s Mouseup from the TableControl’s Mouseup checking for the MouseController type.
//When the mouse button is clicked on the column, it checks and performs the desired operation.
void TableControl_MouseUp(object sender, MouseEventArgs e)
{
int row, col;
this.gridGroupingControl1.TableControl.PointToRowCol(new Point(e.X, e.Y), out row, out col);
GridTableCellStyleInfo style = this.gridGroupingControl1.TableControl.Model[row, col];
IMouseController controller;
this.gridGroupingControl1.TableControl.MouseControllerDispatcher.HitTest(new Point(e.X, e.Y), e.Button, e.Clicks, out controller);
//Checks whether the controller is DragGroupHeader or not
if (controller != null && controller.Name == "DragGroupHeader" && style.TableCellIdentity.Column.Name == "Column2")
{
if (this.gridGroupingControl1.TableDescriptor.GroupedColumns.Count > 0 && col == this.gridGroupingControl1.TableDescriptor.GroupedColumns.Count + 1)
this.gridGroupingControl1.TableControl.GetCellRenderer(row, col - this.gridGroupingControl1.TableDescriptor.GroupedColumns.Count).RaiseMouseUp(row, col - this.gridGroupingControl1.TableDescriptor.GroupedColumns.Count, e);
else
this.gridGroupingControl1.TableControl.GetCellRenderer(row, col).RaiseMouseUp(row, col, e);
}
}'When the mouse button is clicked on the column , it checks and performs the desired operation.
Private Sub TableControl_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
Dim row, col As Integer
Me.gridGroupingControl1.TableControl.PointToRowCol(New Point(e.X, e.Y), row, col)
Dim style As GridTableCellStyleInfo = Me.gridGroupingControl1.TableControl.Model(row, col)
Dim controller As IMouseController
Me.gridGroupingControl1.TableControl.MouseControllerDispatcher.HitTest(New Point(e.X, e.Y), e.Button, e.Clicks, controller)
'Checks whether the controller is DragGroupHeader or not
If controller IsNot Nothing AndAlso controller.Name = "DragGroupHeader" AndAlso && style.TableCellIdentity.Column.Name = "Column2"Then
If Me.gridGroupingControl1.TableDescriptor.GroupedColumns.Count > 0 AndAlso col = Me.gridGroupingControl1.TableDescriptor.GroupedColumns.Count + 1 Then
Me.gridGroupingControl1.TableControl.GetCellRenderer(row, col - Me.gridGroupingControl1.TableDescriptor.GroupedColumns.Count).RaiseMouseUp(row, col - Me.gridGroupingControl1.TableDescriptor.GroupedColumns.Count, e)
Else
Me.gridGroupingControl1.TableControl.GetCellRenderer(row, col).RaiseMouseUp(row, col, e)
End If
End If
End SubBy default, when the header is clicked, the sorting operation is done in the columns. To avoid this, the sorting is disabled in the header by providing the following code.
this.gridGroupingControl1.TableDescriptor.Columns["Column2"].AllowSort = false;Me.gridGroupingControl1.TableDescriptor.Columns("Column2").AllowSort = False The value of the CheckBox can be received through the SaveCellText handler that saves the value from the Grid. In the given sample, a temporary variable (CheckBoxValue) has been used to keep the modified value of the CheckBox and this value is refreshed through the QueryCellStyleInfo event.
void gridGroupingControl1_SaveCellText(object sender, Syncfusion.Windows.Forms.Grid.GridCellTextEventArgs e)
{
GridTableCellStyleInfo style = (GridTableCellStyleInfo)e.Style;
//Checks whether the cell is header cell or not and the style is enabled
if (style.Enabled && style.TableCellIdentity.TableCellType == GridTableCellType.ColumnHeaderCell)
{
this.CheckBoxValue = bool.Parse(e.Text);
e.Handled = true;
}
}Private Sub gridGroupingControl1_SaveCellText(ByVal sender As Object, ByVal e As Syncfusion.Windows.Forms.Grid.GridCellTextEventArgs)
Dim style As GridTableCellStyleInfo = CType(e.Style, GridTableCellStyleInfo)
'Checks whether the cell is header cell or not and the style is enabled
If style.Enabled AndAlso style.TableCellIdentity.TableCellType = GridTableCellType.ColumnHeaderCell Then
Me.CheckBoxValue = Boolean.Parse(e.Text)
e.Handled = True
End If
End SubWhen the CheckBox is clicked, it enables/disables all the check boxes in the column except the header cell.
void gridGroupingControl1_TableControlCheckBoxClick(object sender, GridTableControlCellClickEventArgs e)
{
GridTableCellStyleInfo style = (GridTableCellStyleInfo)e.TableControl.GetTableViewStyleInfo(e.Inner.RowIndex, e.Inner.ColIndex);
if (style.Enabled)
{
int column = this.gridGroupingControl1.TableModel.NameToColIndex("Column2");
Console.WriteLine("CheckBoxClicked");
if (style.Enabled && style.TableCellIdentity.TableCellType == GridTableCellType.ColumnHeaderCell)
{
chk = (bool)this.gridGroupingControl1.TableModel[style.TableCellIdentity.RowIndex, column].CellValue;
//Updates the changes
e.TableControl.BeginUpdate();
foreach (Record rec in e.TableControl.Table.Records)
{
int rowIndex = e.TableControl.Table.DisplayElements.IndexOf(rec);
GridTableCellStyleInfo rowStyle = (GridTableCellStyleInfo)e.TableControl.GetTableViewStyleInfo(rowIndex, column);
if (rowStyle.Enabled)
rec.SetValue("Column2", !chk);
}
e.TableControl.EndUpdate(true);
}
if (style.Enabled && (style.TableCellIdentity.TableCellType == GridTableCellType.RecordFieldCell || style.TableCellIdentity.TableCellType == GridTableCellType.AlternateRecordFieldCell) && style.TableCellIdentity.Column.Name == "Column2")
{
Record currentRecord = style.TableCellIdentity.DisplayElement.GetRecord();
bool curStatus = bool.Parse(style.Text);
//Updates the changes
e.TableControl.BeginUpdate();
//Gets the records
foreach (Record r in e.TableControl.Table.Records)
{
if (r != currentRecord)
{
check = bool.Parse(r.GetValue(style.TableCellIdentity.Column.Name).ToString());
ht.Add(check);
}
}
e.TableControl.EndUpdate();
if (ht.Contains(curStatus) && !ht.Contains(!curStatus))
{
if (curStatus)
CheckBoxValue = false;
this.gridGroupingControl1.TableModel[2, column].CellValue = curStatus;
}
else if (!ht.Contains(curStatus))
{
this.gridGroupingControl1.TableModel[2, column].CellValue = curStatus;
CheckBoxValue = !curStatus;
}
ht.Clear();
}
}
this.gridGroupingControl1.TableControl.Refresh();
}Private Sub gridGroupingControl1_TableControlCheckBoxClick(ByVal sender As Object, ByVal e As GridTableControlCellClickEventArgs)
Dim style As GridTableCellStyleInfo = CType(e.TableControl.GetTableViewStyleInfo(e.Inner.RowIndex, e.Inner.ColIndex), GridTableCellStyleInfo)
If style.Enabled Then
Dim column As Integer = Me.gridGroupingControl1.TableModel.NameToColIndex("Column2")
Console.WriteLine("CheckBoxClicked")
If style.Enabled AndAlso style.TableCellIdentity.TableCellType = GridTableCellType.ColumnHeaderCell Then
chk = CBool(Me.gridGroupingControl1.TableModel(style.TableCellIdentity.RowIndex, column).CellValue)
'Updates the changes
e.TableControl.BeginUpdate()
For Each rec As Record In e.TableControl.Table.Records
Dim rowIndex As Integer = e.TableControl.Table.DisplayElements.IndexOf(rec)
Dim rowStyle As GridTableCellStyleInfo = CType(e.TableControl.GetTableViewStyleInfo(rowIndex, column), GridTableCellStyleInfo)
If rowStyle.Enabled Then
rec.SetValue("Column2", (Not chk))
End If
Next rec
e.TableControl.EndUpdate(True)
End If
If style.Enabled AndAlso (style.TableCellIdentity.TableCellType = GridTableCellType.RecordFieldCell OrElse style.TableCellIdentity.TableCellType = GridTableCellType.AlternateRecordFieldCell) AndAlso style.TableCellIdentity.Column.Name = "Column2" Then
Dim currentRecord As Record = style.TableCellIdentity.DisplayElement.GetRecord()
Dim curStatus As Boolean = Boolean.Parse(style.Text)
'Updates the changes
e.TableControl.BeginUpdate()
'Gets the records
For Each r As Record In e.TableControl.Table.Records
If r IsNot currentRecord Then
check = Boolean.Parse(r.GetValue(style.TableCellIdentity.Column.Name).ToString())
ht.Add(check)
End If
Next r
e.TableControl.EndUpdate()
If ht.Contains(curStatus) AndAlso (Not ht.Contains((Not curStatus))) Then
If curStatus Then
CheckBoxValue = False
End If
Me.gridGroupingControl1.TableModel(2, column).CellValue = curStatus
ElseIf Not ht.Contains(curStatus) Then
Me.gridGroupingControl1.TableModel(2, column).CellValue = curStatus
CheckBoxValue = Not curStatus
End If
ht.Clear()
End If
End If
Me.gridGroupingControl1.TableControl.Refresh()
End SubAfter
applying the properties, the Grid is shown as follows,

Figure 1: Enabling the CheckBoxes in the column
Conclusion
I hope you enjoyed learning about how to place CheckBox in header cell of WinForms GridGroupingControl.
You can refer to our WinForms GridGroupingControl’s feature tour page to know about its other groundbreaking feature representations. You can also explore our WinForms GridGroupingControl documentation to understand how to present and manipulate data.
For current customers, you can check out our WinForms components from the License and Downloads page. If you are new to Syncfusion, you can try our 30-day free trial to check out our WinForms GridGroupingControl and other WinForms components.
If you have any queries or require clarifications, please let us know in comments below. You can also contact us through our support forums, Direct-Trac, or feedback portal. We are always happy to assist you!