The following code snippet is used to add CheckBox in Column Header of DataGridView.
Features:
/* When the Column Header check box is selected, all row check boxes will be selected */
/* When the Column Header check box is deselected, all row check boxes will be deselected */
/* When any row check box is deselected while the Column Header check box is selected, the column header check box will be deselected */
/*When the Column Header check box is selected while any of row check box is in edit mode, that checkbox will also get selected.
[CODE]
Dim bForceUnCheck As Boolean = False
:
:
:
Private Sub populateGridView()
'Declaration of variables
Dim strSql As String
Dim dt As New DataTable
Dim cmd As SqlCommand
Me.Cursor = Cursors.WaitCursor
Try
strSql = "SELECT TOP " & nPageSize & " * FROM " & table
cmd = New SqlCommand(strSql, connection)
cmd.CommandTimeout = 999999
dataAdapter = New SqlDataAdapter(cmd)
Me.Cursor = Cursors.WaitCursor
dataAdapter.Fill(dt)
Me.dbGridView.SuspendLayout()
Me.dbGridView.DataSource = dt
Me.dbGridView.ResumeLayout()
Me.Cursor = Cursors.Default
Catch ex As SqlException
MessageBox.Show(ex.Message)
Me.Cursor = Cursors.Default
Me.dbGridView.DataSource = Nothing
Exit Sub
End Try
' Customize DataGridView, add checkbox column
Dim checkboxColumn As DataGridViewCheckBoxColumn = New DataGridViewCheckBoxColumn()
checkboxColumn.Name = "chkBox"
checkboxColumn.Width = 30
checkboxColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
'Add it is a First Column
DataGridView1.Columns.Insert(0, checkboxColumn)
' Add Checkbox Column Header
Dim rect As Rectangle = DataGridView1.GetCellDisplayRectangle(0, -1, True)
' set checkbox header to center of header cell. +1 pixel to position correctly.
rect.X = rect.Location.X + (rect.Width / 4)
Dim checkboxHeader As CheckBox = New CheckBox()
checkboxHeader.Name = "SELECTALL"
checkboxHeader.Size = New Size(18, 18)
checkboxHeader.Location = rect.Location
AddHandler checkboxHeader.CheckedChanged, AddressOf checkboxHeader_CheckedChanged
DataGridView1.Controls.Add(checkboxHeader)
End Sub
[/CODE]
'This Function handles the state change of Checkbox Column Header
[CODE]
Private Sub checkboxHeader_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
If Not bForceUnCheck Then
DataGridView1.EndEdit()'To override the individually selected cells
For i As Integer = 0 To DataGridView1.RowCount - 1
DataGridView1(0, i).Value = CType(DataGridView1.Controls.Find("SELECTALL", True)(0), CheckBox).Checked
Next
End If
bForceUnCheck = False
End Sub
[/CODE]
'This function handles the CheckBox state changed event for each row of datagridview
[CODE]
Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
If CType(sender, DataGridView).Columns(e.ColumnIndex).Name = "chkBox" And e.RowIndex >= 0 Then
Dim dgCB As DataGridViewCheckBoxCell
dgCB = CType(DataGridView1("chkBox", e.RowIndex), DataGridViewCheckBoxCell)
'Uncheck the header checkbox when any of the check box in the row
'is deselected
If Not CBool(dgCB.EditedFormattedValue) Then
'Checkbox Unselected
If CType(DataGridView1.Controls.Find("SELECTALL", True)(0), CheckBox).Checked Then
bForceUnCheck = True
CType(DataGridView1.Controls.Find("SELECTALL", True)(0), CheckBox).Checked = False
End If
End If
End If
End Sub
[/CODE]
Exactly what I was looking for, thank you!
ReplyDeleteHi,
ReplyDeleteThank you for the code.
I just wanted to add more flexibility to this code by letting the individual rows to be selectable as well. In this case the check is working only from the column header checkbox whereas i want even if i want to select random rows manually, i should be able to. Can you help plz?
Lagan