测试环境:windows 7和Microsoft Visual Studio 2015
点击下载本文源码
VB.NET虽然提供了大量控件供我们使用,但很多控件仅提供最基础的功能。比如用DataGridView控件可以非常方便显示或操作数据库数据,我们可以在首列添加DataGridViewCheckBoxColumn列进行全选或全不选操作,但Datagridview控件并没有提供我们平时用的全选或取消全选的复选框,他的表头就只有这一列的名称,这样会影响用户的使用体验。这就需要我们对DataGridViewCheckBoxColumn列的列头进行扩展,创建符合使用要求的自定义控件。
一、自定义控件介绍
VB.NET中的窗体(WinFrom)自定义控件大致有三种形式:
1、组合控件(CompositeControls):继承自UserControl类,将目前现有的控件根据需要组合到一起形成一个新的控件。
2、扩展控件(ExtendedControls):继承自.NET类库中已有的控件,添加一些新的属性和方法来扩展原有控件。
3、自定义控件(CustomControls):继承自Control类,不提供控件特定的功能或图形界面,控件的绘制全部由用户定义。
二、扩展DataGridViewColumnHeaderCell类
可以在DataGridViewCheckBoxColumn列的列头拉一个CheckBox来实现全选全不选,但CheckBox的位置不好调控。最好的方法是扩展DataGridViewColumnHeaderCell类,在列头绘制一个复选框checkbox控件,通过定义checkbox鼠标单击事件来实现行的全选或取消全选。
效果如下图所示:
1、新建一个windows窗体应用程序项目。
为项目添加新项,取名DataGridViewCheckBoxColumnHeaderCellEx,类库。如下图所示整个项目包含一个类库和一个窗体。
2、用下面代码替换类库DataGridViewCheckBoxColumnHeaderCellEx.vb中自动生成的代码。
Option Strict On
Option Infer Off
Option Explicit On
'Imports System
'Imports System.Collections.Generic
'Imports System.Text
'Imports System.Windows.Forms
'Imports System.Drawing
Imports System.Windows.Forms.VisualStyles
Imports System.Runtime.InteropServices
#Region "扩展表头单元格"
Public Class DataGridViewCheckBoxColumnHeaderCellEx
Inherits DataGridViewColumnHeaderCell
' 委托处理DataGridViewCheckBoxClickedHandler事件
Public Delegate Sub DataGridViewCheckBoxClickedHandler(ByVal columnIndex As Integer, ByVal isCheckedAll As Boolean)
Public Event OnCheckBoxClicked As DataGridViewCheckBoxClickedHandler
#Region "属性"
''' <summary>
''' 标识本列是否全选,方便在Cell中获取
''' </summary>
''' <returns></returns>
Public ReadOnly Property IsCheckedAll As Boolean
Get
Return CheckedAllState = CheckState.Checked
End Get
End Property
Private m_checkedAllState As CheckState = CheckState.Unchecked
''' <summary>
''' 全选按钮状态
''' </summary>
''' <returns></returns>
Public Property CheckedAllState As CheckState
Get
Return m_checkedAllState
End Get
Set(ByVal value As CheckState)
m_checkedAllState = value
End Set
End Property
''' <summary>
''' 用于标识当前的checkbox状态
''' </summary>
Protected m_checkboxState As CheckBoxState = CheckBoxState.Unche