Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Namespace SelectAll
Public Partial Class frmSelectAll
Inherits Form
Private TotalCheckBoxes As Integer = 0
Private TotalCheckedCheckBoxes As Integer = 0
Private HeaderCheckBox As CheckBox = Nothing
Private IsHeaderCheckBoxClicked As Boolean = False
Public Sub New()
InitializeComponent()
End Sub
Private Sub frmSelectAll_Load(ByVal sender As Object, ByVal e As EventArgs)
AddHeaderCheckBox()
AddHandler HeaderCheckBox.KeyUp, AddressOf HeaderCheckBox_KeyUp
AddHandler HeaderCheckBox.MouseClick, AddressOf HeaderCheckBox_MouseClick
AddHandler dgvSelectAll.CellValueChanged, AddressOf dgvSelectAll_CellValueChanged
AddHandler dgvSelectAll.CurrentCellDirtyStateChanged, AddressOf dgvSelectAll_CurrentCellDirtyStateChanged
AddHandler dgvSelectAll.CellPainting, AddressOf dgvSelectAll_CellPainting
BindGridView()
End Sub
Private Sub BindGridView()
dgvSelectAll.DataSource = GetDataSource()
TotalCheckBoxes = dgvSelectAll.RowCount
TotalCheckedCheckBoxes = 0
End Sub
Private Function GetDataSource() As DataTable
Dim dTable As New DataTable()
Dim dRow As DataRow = Nothing
Dim dTime As DateTime
Dim rnd As New Random()
dTable.Columns.Add("IsChecked", System.Type.[GetType]("System.Boolean"))
dTable.Columns.Add("RandomNo")
dTable.Columns.Add("Date")
dTable.Columns.Add("Time")
For n As Integer = 0 To 9
dRow = dTable.NewRow()
dTime = DateTime.Now
dRow("IsChecked") = "false"
dRow("RandomNo") = rnd.NextDouble()
dRow("Date") = dTime.ToString("MM/dd/yyyy")
dRow("Time") = dTime.ToString("hh:mm:ss tt")
dTable.Rows.Add(dRow)
dTable.AcceptChanges()
Next
Return dTable
End Function
Private Sub dgvSelectAll_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
If Not IsHeaderCheckBoxClicked Then
RowCheckBoxClick(DirectCast(dgvSelectAll(e.ColumnIndex, e.RowIndex), DataGridViewCheckBoxCell))
End If
End Sub
Private Sub dgvSelectAll_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs)
If TypeOf dgvSelectAll.CurrentCell Is DataGridViewCheckBoxCell Then
dgvSelectAll.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
Private Sub HeaderCheckBox_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs)
HeaderCheckBoxClick(DirectCast(sender, CheckBox))
End Sub
Private Sub HeaderCheckBox_KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs)
If e.KeyCode = Keys.Space Then
HeaderCheckBoxClick(DirectCast(sender, CheckBox))
End If
End Sub
Private Sub dgvSelectAll_CellPainting(ByVal sender As Object, ByVal e As DataGridViewCellPaintingEventArgs)
If e.RowIndex = -1 AndAlso e.ColumnIndex = 0 Then
ResetHeaderCheckBoxLocation(e.ColumnIndex, e.RowIndex)
End If
End Sub
Private Sub AddHeaderCheckBox()
HeaderCheckBox = New CheckBox()
HeaderCheckBox.Size = New Size(15, 15)
'Add the CheckBox into the DataGridView
Me.dgvSelectAll.Controls.Add(HeaderCheckBox)
End Sub
Private Sub ResetHeaderCheckBoxLocation(ByVal ColumnIndex As Integer, ByVal RowIndex As Integer)
'Get the column header cell bounds
Dim oRectangle As Rectangle = Me.dgvSelectAll.GetCellDisplayRectangle(ColumnIndex, RowIndex, True)
Dim oPoint As New Point()
oPoint.X = oRectangle.Location.X + (oRectangle.Width - HeaderCheckBox.Width) / 2 + 1
oPoint.Y = oRectangle.Location.Y + (oRectangle.Height - HeaderCheckBox.Height) / 2 + 1
'Change the location of the CheckBox to make it stay on the header
HeaderCheckBox.Location = oPoint
End Sub
Private Sub HeaderCheckBoxClick(ByVal HCheckBox As CheckBox)
IsHeaderCheckBoxClicked = True
For Each Row As DataGridViewRow In dgvSelectAll.Rows
DirectCast(Row.Cells("chkBxSelect"), DataGridViewCheckBoxCell).Value = HCheckBox.Checked
Next
dgvSelectAll.RefreshEdit()
TotalCheckedCheckBoxes = If(HCheckBox.Checked, TotalCheckBoxes, 0)
IsHeaderCheckBoxClicked = False
End Sub
Private Sub RowCheckBoxClick(ByVal RCheckBox As DataGridViewCheckBoxCell)
If RCheckBox IsNot Nothing Then
'Modifiy Counter;
If CBool(RCheckBox.Value) AndAlso TotalCheckedCheckBoxes < TotalCheckBoxes Then
TotalCheckedCheckBoxes += 1
ElseIf TotalCheckedCheckBoxes > 0 Then
TotalCheckedCheckBoxes -= 1
End If
'Change state of the header CheckBox.
If TotalCheckedCheckBoxes < TotalCheckBoxes Then
HeaderCheckBox.Checked = False
ElseIf TotalCheckedCheckBoxes = TotalCheckBoxes Then
HeaderCheckBox.Checked = True
End If
End If
End Sub
End Class
End Namespace
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment