VB.NET学习笔记:自定义控件之扩展DataGridViewColumnHeaderCell类增加CheckBox全选复选框

测试环境: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窗体应用程序项目。
新建项目-windows窗体应用程序
为项目添加新项,取名DataGridViewCheckBoxColumnHeaderCellEx,类库。如下图所示整个项目包含一个类库和一个窗体。
项目包含2项
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
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 WinForms 的 DataGridView 件中,可以通过使用 ColumnHeader 属性来实现多表头。具体步骤如下: 1. 设置件的 ColumnHeadersVisible 属性为 false,这将隐藏默认的表头。 2. 添加自定义表头。可以使用 DataGridViewColumn 对象来创建列,然后使用 DataGridView.Columns.Add 方法将列添加到件中。每个列可以包含一个或多个子列,用于创建自定义表头。 3. 设置每个列的 HeaderCell 属性为 DataGridViewColumnHeaderCell 对象。这将使该列的默认表头与自定义表头分离。 4. 设置每个子列的 HeaderCell 属性为 DataGridViewColumnHeaderCell 对象。这将使该子列的默认表头与自定义表头分离,并将其添加到相应的列中。 下面是一个简单的示例代码,用于创建一个带有两个表头的 DataGridView 件: ```csharp // 隐藏默认表头 dataGridView1.ColumnHeadersVisible = false; // 创建第一级表头 DataGridViewColumn column1 = new DataGridViewTextBoxColumn(); column1.HeaderText = "表头1"; column1.Name = "Column1"; dataGridView1.Columns.Add(column1); // 创建第二级表头 DataGridViewColumn subColumn1 = new DataGridViewTextBoxColumn(); subColumn1.HeaderText = "子表头1"; subColumn1.Name = "SubColumn1"; DataGridViewColumn subColumn2 = new DataGridViewTextBoxColumn(); subColumn2.HeaderText = "子表头2"; subColumn2.Name = "SubColumn2"; column1.HeaderCell = new DataGridViewColumnHeaderCell(); column1.HeaderCell.Value = "表头1"; column1.HeaderCell.Style.Font = new Font(dataGridView1.Font, FontStyle.Bold); column1.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter; column1.HeaderCell.Style.BackColor = Color.LightGray; column1.HeaderCell.Style.WrapMode = DataGridViewTriState.True; column1.HeaderCell.Style.Padding = new Padding(2, 2, 2, 2); column1.HeaderCell.Style.SelectionBackColor = Color.DarkGray; column1.HeaderCell.Style.SelectionForeColor = Color.White; column1.HeaderCell.Style.SelectionBorderWidth = 2; column1.HeaderCell.Style.SelectionBorderColor = Color.Black; column1.HeaderCell.Style.SelectionFont = new Font(dataGridView1.Font, FontStyle.Bold); column1.HeaderCell.Style.SelectionAlignment = DataGridViewContentAlignment.MiddleCenter; subColumn1.HeaderCell = new DataGridViewColumnHeaderCell(); subColumn1.HeaderCell.Value = "子表头1"; subColumn2.HeaderCell = new DataGridViewColumnHeaderCell(); subColumn2.HeaderCell.Value = "子表头2"; column1.DataGridView.Columns.AddRange(new DataGridViewColumn[] { subColumn1, subColumn2 }); ``` 在这个示例中,我们创建了一个带有两个表头的 DataGridView 件,并将其添加到窗体上。第一级表头为“表头1”,第二级表头包含两个子列:“子表头1”和“子表头2”。我们还设置了一些样式属性,以更改表头的外观和行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值