VB.net下DataGridView的自定义 数据可并、多行标题

本文介绍了如何在VB.net中实现DataGridView的自定义数据合并和多行标题。通过创建一个继承自DataGridView的自定义类DGV_MulCapRowMerge,实现了列头的多级合并和数据行的合并。详细展示了类的属性和方法,并提供了示例代码和窗体设计器部分,帮助读者理解并应用到自己的项目中。
摘要由CSDN通过智能技术生成

     编程过程中经常遇到数据合并和多行标头的情况,以前用VB6挺顺手,现在用.net后,感觉一切都变了,查阅了很多人的资料后,我也简单的编写了一个,现在发出来,但愿有缘人能够将它完善,或者有所借鉴,我就足矣。因为本人技术有限,不当之处请多包涵。

   使用的是中文版本的VS2005

   

 

'类的代码

Imports System.ComponentModel
Imports System.Collections.Generic
Public Class DGV_MulCapRowMerge
    Inherits DataGridView
    Private _columnCaptions As String()
    Private _ColCap As String(,)
    Private _cellHeight As Integer = 25
    Private _columnDeep As Integer = 1
    Private _HeaderFont As Font = Me.Font
    Private _mergecolumnname As List(Of String) = New List(Of String)()

    <Description("设置或获得数据列合并的集合")> _
    Public Property MergeColumnNames() As List(Of String)
        Get
            Return _mergecolumnname
        End Get
        Set(ByVal Value As List(Of String))
            _mergecolumnname = Value
        End Set
    End Property

    <Description("设置或获得标头的字体")> _
        Public Property ColHeaderFont() As Font
        Get
            Return _HeaderFont
        End Get
        Set(ByVal value As Font)
            _HeaderFont = value
        End Set
    End Property
    <Description("设置或获得合并表头的深度")> _
    Public Property ColumnDeep() As Integer
        Get
            If Me.Columns.Count = 0 Then
                _columnDeep = 1
            End If
            Me.ColumnHeadersHeight = _cellHeight * _columnDeep

            Return _columnDeep
        End Get
        Set(ByVal value As Integer)
            If value < 1 Then
                _columnDeep = 1
            Else
                _columnDeep = value
            End If
            Me.ColumnHeadersHeight = _cellHeight * _columnDeep
        End Set
    End Property

    <Description("添加合并式单元格绘制的所需要的对象")> _
    Public Property ColumnSCaption() As String()
        Get
            Return _columnCaptions
        End Get
        Set(ByVal value As String())
            _columnCaptions = value
            GetCaption()
        End Set
    End Property
    Private Sub GetCaption()
        Dim iRow As Integer = _columnCaptions.GetLength(0)
        If iRow > 0 Then '表示设置OK
            On Error Resume Next
            Dim strCap As String() = _columnCaptions(0).Split(",")
            Dim iCol As Integer = strCap.GetLength(0) - 1
            '     Me.Columns.Clear()
            ReDim Preserve _ColCap(iRow, iCol)
            For iR As Integer = 0 To iRow - 1
                For iC As Integer = 0 To iCol
                    _ColCap(iR, iC) = strCap(iC)
                Next
                If iR + 1 < iRow Then
                    strCap = _columnCaptions(iR + 1).Split(",")
                End If
            Next
        End If
    End Sub
    Protected Overrides Sub OnCellPainting(ByVal e As DataGridViewCellPaintingEventArgs)
        If e.RowIndex > -1 And e.ColumnIndex > -1 Then  '数据区重新回执
            DrawCell(e)
        ElseIf e.RowIndex = -1 And e.ColumnIndex > -1 Then '列头重新绘制
            If _columnDeep = 1 Then
                MyBase.OnCellPainting(e)
                '  e.Handled = True
                Exit Sub
            End If
            Dim ILev As Integer = ColumnDeep
            Do While ILev > 0
                PaintUnitHeader(e, ILev)
                ILev = ILev - 1
            Loop
            e.Handled = True
        ElseIf e.ColumnIndex = -1 Then
            MyBase.OnCellPainting(e)
            Exit Sub
        End If
    End Sub


    Private Sub DrawCell(ByVal e As DataGridViewCellPaintingEventArgs)
        If e.CellStyle.Alignment = DataGridViewContentAlignment.NotSet Then
            e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        End If
        Dim gridBrush As Brush = New SolidBrush(Me.GridColor)
        Dim backBrush As SolidBrush = New SolidBrush(Color.White)
        Dim fontBrush As SolidBrush = New SolidBrush(e.CellStyle.ForeColor)
        Dim cellwidth As Integer
        Dim UpRows As Integer = 0
        Dim DownRows As Integer = 0
        Dim count As Integer = 0
        Try
            If Me.MergeColumnNames.Contains(Me.Columns(e.ColumnIndex).Name) And e.RowIndex <> -1 Then '如果本列需要合并
                cellwidth = e.CellBounds.Width
                Dim gridLinePen As Pen = New Pen(gridBrush)
                Dim curValue As String = CType(e.Value, String)
                If curValue Is Nothing Then Exit Sub

                Dim curSelected As String = CType(Me.CurrentRow.Cells(e.ColumnIndex).Value, String)
 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值