编程过程中经常遇到数据合并和多行标头的情况,以前用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)