DataGridView单元格合并VB实现

更新时间:2024-04-10 18:33:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

DataGridView单元格合并VB.NET实现

已封装成类,调用方便。 效果如下:

Public Class Form1

Private cmb As CmbDatagridbiew

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load '测试数据

DataGridView1.ColumnCount = 6 DataGridView1.Columns(0).Name = \ DataGridView1.Columns(1).Name = \ DataGridView1.Columns(2).Name = \ DataGridView1.Columns(3).Name = \ DataGridView1.Columns(4).Name = \ DataGridView1.Columns(5).Name = \

Dim row As String() = New String() {\, \, \, \, \, \} : DataGridView1.Rows.Add(row)

row = New String() {\, \, \, \, \, \} : DataGridView1.Rows.Add(row)

row = New String() {\, \, \, \, \, \} : DataGridView1.Rows.Add(row)

row = New String() {\, \, \, \, \, \} : DataGridView1.Rows.Add(row)

'调用

cmb = New CmbDatagridbiew(Me.DataGridView1)

cmb.Add(0, 0, 1, 2) '要合并的单元格·([行索引·左上],[列索引·左上],[行索引·右下],[列索引·右下])

cmb.Add(1, 3, 3, 4) '要合并的单元格·([行索引·左上],[列索引·左上],[行索引·右下],[列索

引·右下])

End Sub End Class

'*********************************************************************** '*********************************************************************** '·合并单元格类 '·调用示例: ' 声明

' Private cmb As CmbDatagridbiew '

' 表格加载完成后

' cmb = New CmbDatagridbiew(Me.DataGridView1) ' cmb.Add(0, 0, 1, 2)

' * 参数说明:([行索引·左上],[列索引·左上],[行索引·右下],[列索引·右下]) ' * 【0,0】 【0,1】 【0,2】 ' * 【1,0】 【1,1】 【1,2】 ' * cmb.Add(0, 0, 1, 2)

'*********************************************************************** Public Class CmbDatagridbiew

Private data As New List(Of MyRect) Private Dgv As DataGridView

Public Sub New(_dgv As DataGridView) Me.Dgv = _dgv

AddHandler _dgv.CellPainting, AddressOf DGV_CellPainting End Sub

Public Sub Add(_rect As MyRect) Me.data.Add(_rect) Me.SetCellEnabled(_rect) End Sub

Public Sub Add(_top As Integer, _left As Integer, _bottom As Integer, _right As Integer) Me.data.Add(New MyRect(_top, _left, _bottom, _right)) Me.SetCellEnabled(New MyRect(_top, _left, _bottom, _right)) End Sub

Private Sub SetCellEnabled(_rect As MyRect) For i = _rect.Top To _rect.Bottom For j = _rect.Left To _rect.Right

Me.Dgv.Rows(i).Cells(j).ReadOnly = True Next Next End Sub

Private Function InRects(rowIndex As Integer, colIndex As Integer) As Integer For i = 0 To Me.data.Count - 1

If Me.data(i).InRect(rowIndex, colIndex) Then Return i Next Return -1 End Function

Private Sub DGV_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Using gridBrush As Brush = New SolidBrush(Me.Dgv.GridColor), backColorBrush As SolidBrush = New SolidBrush(e.CellStyle.BackColor) Using gridLinePen = New Pen(gridBrush) If Me.data.Count = 0 Then Return

Dim index As Integer = Me.InRects(e.RowIndex, e.ColumnIndex) If index = -1 Then Return

e.Graphics.FillRectangle(backColorBrush, e.CellBounds)

If e.RowIndex = Me.data(index).Bottom Then e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1) If e.ColumnIndex = Me.data(index).Right Then e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1) e.Handled = True

For i = 0 To Me.data.Count - 1

Dim rect1 As Rectangle = Me.Dgv.GetCellDisplayRectangle(Me.data(i).Left, Me.data(i).Top, False)

Dim rect2 As Rectangle = Me.Dgv.GetCellDisplayRectangle(Me.data(i).Right, Me.data(i).Bottom, False)

Dim rect As New Rectangle(rect1.Left, rect1.Top, rect2.Right - rect1.Left, rect2.Bottom - rect1.Top)

Dim text As String Try text =

Me.Dgv.Rows(Me.data(i).Top).Cells(Me.data(i).Left).Value.ToString().Trim() Catch ex As Exception text = \ End Try

Dim sz As Drawing.SizeF = e.Graphics.MeasureString(text, e.CellStyle.Font) e.Graphics.DrawString(text, e.CellStyle.Font, New

SolidBrush(e.CellStyle.ForeColor), rect.Left + (rect.Width - sz.Width) / 2, rect.Top + (rect.Height - sz.Height) / 2, StringFormat.GenericDefault) Next End Using End Using End Sub End Class

Public Class MyRect Public Top As Integer

Public Right As Integer Public Bottom As Integer Public Left As Integer

Public Sub New(_top As Integer, _left As Integer, _bottom As Integer, _right As Integer) Me.Top = _top Me.Right = _right Me.Bottom = _bottom Me.Left = _left End Sub

Public Function InRect(rowIndex As Integer, colIndex As Integer) As Boolean

If rowIndex >= Me.Top And rowIndex <= Me.Bottom And colIndex >= Me.Left And colIndex <= Me.Right Then

Return True Else

Return False End If End Function End Class

'*********************************************************************** '#End CmbDatagridbiew

'***********************************************************************

作者:西门吹雪

玉树临风工作室荣誉出品

本文来源:https://www.bwwdw.com/article/ndur.html

Top