调用合并DataGridView单元格的类之后,无法释放这个类的实例!

weixin_38059644 2017-08-30 12:42:36

前情:
  调用一个自定义的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


    
...全文
16 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧