为CGridHelper增加合并单元格的能力

一、关于起因

昨天刚刚完成了CGridHelper的部分代码,今天的需求就变动了,需要为这个类添加合并单元格内容的能力。DataGridView控件本身没有提供这个功能,需要自己写代码实现。首先想到的是拿来主义,网上搜罗了一下,找了段C#代码,翻译成Vb.net之后呈现给大家。最终实现的效果如下图所示:

二、CGridHelper新的调用代码
1         Dim mGridHelper As New CGridHelper(GridVersion, Color.FromArgb(250, 250, 250),
2             New Font("微软雅黑", 10), 30, Color.FromArgb(159, 210, 235), Color.FromArgb(0, 0, 0), 24,
3             New Font("微软雅黑", 9), 30, Color.FromArgb(250, 250, 250), Color.FromArgb(225, 225, 225), Color.FromArgb(0, 0, 0),
4             "0;80;70;595", "M;M;M;L", "1;2")

新的调用通过最后一个MergeColumn字符串参数设置,将需要合并的列号以逗号进行分隔。

三、CGridHelper变动部分代码
 1     Private WithEvents mGrid As DataGridView
 2 
 3     Private mMergeColumn As String
 4     Public Property MergeColumn() As String
 5         Get
 6             Return mMergeColumn
 7         End Get
 8         Set(ByVal value As String)
 9             mMergeColumn = value
10         End Set
11     End Property
12 
13     Private Function GetMergeComumns() As List(Of Integer)
14         If Me.MergeColumn Is Nothing OrElse Me.MergeColumn.Length = 0 Then Return Nothing
15         Dim mCol As List(Of String) = Me.MergeColumn.Split(";").ToList
16         Dim rtl As New List(Of Integer)
17         For Each str As String In mCol
18             On Error Resume Next
19             rtl.Add(CType(str, Integer))
20         Next
21         Return rtl
22     End Function
23 
24     Private Sub mGrid_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles mGrid.CellPainting
25         Dim mCols As List(Of Integer) = Me.GetMergeComumns()
26         If mCols Is Nothing OrElse mCols.Count = 0 Then Exit Sub
27         If e.RowIndex = -1 Then Exit Sub
28         If Not mCols.Exists(Function(v As Integer) v = e.ColumnIndex) Then Exit Sub
29         Using gridBrush As New SolidBrush(Me.Grid.GridColor), backColorBrush As New SolidBrush(e.CellStyle.BackColor)
30             Using gridLinePen As New Pen(gridBrush)
31                 e.Graphics.FillRectangle(backColorBrush, e.CellBounds)  '//清除单元格
32                 '// 画 Grid 边线(仅画单元格的底边线和右边线)
33                 '// 如果下一行和当前行的数据不同,则在当前的单元格画一条底边线
34                 If e.RowIndex < Me.Grid.Rows.Count - 1 AndAlso
35                     Me.Grid.Rows(e.RowIndex + 1).Cells(e.ColumnIndex).Value.ToString <> e.Value.ToString Then
36                     e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
37                 End If
38                 '//画最后一条记录的底线 
39                 If e.RowIndex = Me.Grid.Rows.Count - 1 Then
40                     e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left + 2, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
41                 End If
42                 '//画右边线
43                 e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom)
44                 '// 画(填写)单元格内容,相同的内容的单元格只填写第一个
45                 If Not e.Value Is Nothing Then
46                     If Not (e.RowIndex > 0 AndAlso Me.Grid.Rows(e.RowIndex - 1).Cells(e.ColumnIndex).Value.ToString = e.Value.ToString) Then
47                         e.Graphics.DrawString(e.Value, e.CellStyle.Font, Brushes.Black, e.CellBounds.X + 2, e.CellBounds.Y + 5, StringFormat.GenericDefault)
48                     End If
49                     e.Handled = True
50                 End If
51             End Using
52         End Using
53     End Sub
原文地址:https://www.cnblogs.com/alexywt/p/6708143.html