调用合并DataGridView单元格的类之后,无法释放这个类的实例!
前情:
调用一个自定义的DataGridView单元格合并类,合并功能没有问题,但有一个BUG;
问题:
在一个窗体中,有两个按扭,一个DataGridView ,数据是通过按扭切换,加载不同的数据。
当第一次调用这个合并单元格类建立实例后,在第一个表格中能按要求合并单元格,但是,当按下另一按扭,在同一个DataGridView中加载新的数据时,虽然没有在切换时加入合并单元格动作,但这些合并动作还在,也就是在新的显示表格中,依然还在进行合并。
查看源码,并没有释放资源取消动作的功能,也不知道怎么实现这功能,请高手指教;
'·合并单元格类
'·调用示例:
' 声明
' Private meg As MergeCells
'
' 表格加载完成后
' meg = New CmbDatagridbiew(Me.DataGridView1)
' meg.Add(0, 0, 1, 2)
' * 参数说明:([行索引·左上],[列索引·左上],[行索引·右下],[列索引·右下])
' * 【0,0】 【0,1】 【0,2】
' * 【1,0】 【1,1】 【1,2】
'***********************************************************************
Public Class MergeCells
Implements IDisposable
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
Public Class Form2
Private meg As MergeCells
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 初始测试数据
DgwA.Rows.Add(1, 2, 3, 4)
DgwA.Rows.Add(5, 6, 7, 8)
DgwA.Rows.Add(11, 23, 33, 44)
DgwA.Rows.Add(6, 6, 6, 6)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'' 调用
meg = New MergeCells(Me.DgwA)
meg.Add(1, 0, 2, 1) ' 要合并的单元格
DgwA.Refresh()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
DgwA.RowCount = 0
DgwA.ColumnCount = 0
Dim dtc(3) As DataGridViewTextBoxColumn
For k = 0 To dtc.Length - 1
dtc(k) = New DataGridViewTextBoxColumn
DgwA.Columns.Add(dtc(k))
Next
DgwA.Rows.Add(9, 9, 8, 9)
DgwA.Rows.Add(3, 3, 7, 5)
DgwA.Rows.Add(44, 44, 44, 44)
DgwA.Rows.Add(77, 77, 77, 77)
DgwA.Refresh() '问题:并没有要求合并单元格——但合并动作还在,依然进行了合并!
End Sub
End Class