Controls [vb.net] Merge DataGridView Cells / DataGridView 셀병합
페이지 정보
본문
HMergedCell.vb
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.Diagnostics
Imports System.Drawing.Drawing2D
Public Class HMergedCell
Inherits DataGridViewTextBoxCell
Private m_nLeftColumn As Integer = 0
Private m_nRightColumn As Integer = 0
Private m_nTopRow As Integer = 0
Private m_nBottomRow As Integer = 0
Public Property LeftColumn As Integer
Get
Return m_nLeftColumn
End Get
Set(ByVal value As Integer)
m_nLeftColumn = value
End Set
End Property
Public Property RightColumn As Integer
Get
Return m_nRightColumn
End Get
Set(ByVal value As Integer)
m_nRightColumn = value
End Set
End Property
Public Property TopRow As Integer
Get
Return m_nTopRow
End Get
Set(ByVal value As Integer)
m_nTopRow = value
End Set
End Property
Public Property BottomRow As Integer
Get
Return m_nBottomRow
End Get
Set(ByVal value As Integer)
m_nBottomRow = value
End Set
End Property
Protected Overrides Sub Paint(ByVal graphics As Graphics, ByVal clipBounds As Rectangle, ByVal cellBounds As Rectangle, ByVal rowIndex As Integer, ByVal cellState As DataGridViewElementStates, ByVal value As Object, ByVal formattedValue As Object, ByVal errorText As String, ByVal cellStyle As DataGridViewCellStyle, ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, ByVal paintParts As DataGridViewPaintParts)
Try
Dim mergeindex As Integer = ColumnIndex - m_nLeftColumn
Dim i As Integer
Dim nWidth As Integer, nHeight As Integer
Dim nWidthLeft As Integer, nHeightTop As Integer
Dim strText As String
Dim pen As Pen = New Pen(Brushes.Black)
graphics.FillRectangle(New SolidBrush(Color.LightGray), cellBounds)
If rowIndex = m_nBottomRow Then
graphics.DrawLine(New Pen(New SolidBrush(Color.White)), cellBounds.Left, cellBounds.Bottom - 1, cellBounds.Right, cellBounds.Bottom - 1)
End If
If ColumnIndex = m_nRightColumn Then
graphics.DrawLine(New Pen(New SolidBrush(Color.White)), cellBounds.Right - 1, cellBounds.Top, cellBounds.Right - 1, cellBounds.Bottom)
End If
Dim rectDest As RectangleF = RectangleF.Empty
Dim sf As StringFormat = New StringFormat()
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
sf.Trimming = StringTrimming.EllipsisCharacter
nWidth = 0 : nHeight = 0
For i = m_nLeftColumn To m_nRightColumn
nWidth += Me.OwningRow.Cells(i).Size.Width
Next
For i = m_nTopRow To m_nBottomRow
nHeight += Me.DataGridView.Rows(i).Cells(ColumnIndex).Size.Height
Next
nWidthLeft = 0 : nHeightTop = 0
For i = m_nLeftColumn To ColumnIndex - 1
nWidthLeft += Me.OwningRow.Cells(i).Size.Width
Next
For i = m_nTopRow To rowIndex - 1
nHeightTop += Me.DataGridView.Rows(i).Cells(ColumnIndex).Size.Height
Next
strText = Me.OwningRow.Cells(m_nLeftColumn).Value.ToString()
rectDest = New RectangleF(cellBounds.Left - nWidthLeft, cellBounds.Top - nHeightTop, nWidth, nHeight)
graphics.DrawString(strText, New Font(Me.DataGridView.Font.Name, Me.DataGridView.Font.Size), Brushes.Black, rectDest, sf)
Catch ex As Exception
Trace.WriteLine(ex.ToString())
End Try
End Sub
End Class
'// Examle
Dim DGV As DataGridView = DL.DataGridView1
Dim sr As Integer, er As Integer, value As String
Dim pCell As HMergedCell
For i As Integer = 1 To DGV.Rows.Count - 1
If IsDBNull(DGV.Rows(sr).Cells("Subject").Value) Then DGV.Rows(sr).Cells("Subject").Value = ""
If IsDBNull(DGV.Rows(i).Cells("Subject").Value) Then DGV.Rows(i).Cells("Subject").Value = ""
If DGV.Rows(sr).Cells("Subject").Value = DGV.Rows(i).Cells("Subject").Value Then
er = i
Else
If sr < er Then
value = DGV.Rows(sr).Cells("Subject").Value
For n As Integer = sr To er
DGV.Rows(n).Cells("Subject") = New HMergedCell()
pCell = CType(DGV.Rows(n).Cells("Subject"), HMergedCell)
pCell.LeftColumn = 0
pCell.RightColumn = 0
pCell.TopRow = sr
pCell.BottomRow = er
pCell.Value = value
Next
End If
sr = i
End If
Next
If sr > 0 And sr < er Then
value = DGV.Rows(sr).Cells("Subject").Value
For n As Integer = sr To er
DGV.Rows(n).Cells("Subject") = New HMergedCell()
pCell = CType(DGV.Rows(n).Cells("Subject"), HMergedCell)
pCell.LeftColumn = 0
pCell.RightColumn = 0
pCell.TopRow = sr
pCell.BottomRow = er
pCell.Value = value
Next
End If
- 이전글[vb.net] DataGridView 헤더 병합 21.05.02
- 다음글[VBNET] 크로스 스레드 (Cross Thread) 예제 21.05.02
댓글목록
등록된 댓글이 없습니다.