测试环境:windows 7和Microsoft Visual Studio 2015
在《VB.NET学习笔记:自定义控件之扩展DataGridViewColumnHeaderCell类增加CheckBox全选复选框》一文中通过在DataGridView控件的列表头绘制一个CheckBox控件来实现全选功能,实现起来感觉不是很顺手,今天再次仔细研读《开源DataGridView扩展(1) 扩展支持全选的CheckBox列。》博文,该文使用的是C#,我把它翻译成了VB.NET语言,记录下来与大家共勉。
首先新建一个窗体应用程序。
然后再添加一个类,修改类名为DataGridViewEx.vb。
后续:没事又来搞鼓,直接新建类库生成dll,发现必须要建一个自定义控件库来存放DataGridViewEx类,要不然会报错,在此记录一下。
在DataGridViewEx.vb代码窗口里添加如下代码:
Imports System.Windows.Forms.VisualStyles
Imports System.Runtime.InteropServices
Namespace DataGridViewEx
'主要是对DataGridView进行扩展。
''' <summary>
''' 扩展的DataGridView
''' </summary>
Public Class DataGridViewEx
Inherits DataGridView
Public Sub New()
MyBase.New()
End Sub
''' <summary>
''' checkbox的单元格改变事件
''' </summary>
''' <param name="columnIndex"></param>
''' <param name="rowIndex"></param>
''' <param name="value"></param>
Friend Sub OnCheckBoxCellCheckedChange(ByVal columnIndex As Integer, ByVal rowIndex As Integer, ByVal value As Boolean)
Dim existsChecked As Boolean = False, existsNoChecked As Boolean = False
Dim cellEx As ColumnEx.DataGridViewCheckBoxCellEx
For Each row As DataGridViewRow In Me.Rows
cellEx = TryCast(row.Cells(columnIndex), ColumnEx.DataGridViewCheckBoxCellEx)
If cellEx Is Nothing Then Return
existsChecked = existsChecked Or cellEx.Checked
existsNoChecked = existsNoChecked Or Not cellEx.Checked
Next
Dim headerCellEx As ColumnEx.DataGridViewCheckBoxColumnHeaderCellEx = TryCast(Me.Columns(columnIndex).HeaderCell, ColumnEx.DataGridViewCheckBoxColumnHeaderCellEx)
If headerCellEx Is Nothing Then Return
Dim oldState As CheckState = headerCellEx.CheckedAllState
If existsChecked Then
If existsNoChecked Then
headerCellEx.CheckedAllState = CheckState.Indeterminate
Else
headerCellEx.CheckedAllState = CheckState.Checked
End If
Else
headerCellEx.CheckedAllState = CheckState.Unchecked
End If
If oldState <> headerCellEx.CheckedAllState Then Me.InvalidateColumn(columnIndex)
End Sub
''' <summary>
''' 全选中/取消全选中
''' </summary&