DataGridView

DataGridView列ヘッダーを分割表示

DataGridViewでヘッダーセルの結合・分割を行う場合、DataGridViewに既定で用意されている「CellPainting」イベントを使う。

下記のような列ヘッダーをカスタマイズする例です。

Private Sub DataGridView1_CellPainting(sender As System.Object,
 e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
    ' ガード句
    If e.RowIndex > -1 Then
        ' ヘッダー以外は処理なし
        Return
    End If

    '2~3列目を結合する処理
    If e.ColumnIndex = 1 Then
        ' 処理対象セルが、2列目の場合のみ処理を行う
        ' セルの矩形を取得
        Dim rect As Rectangle = e.CellBounds

        Dim dgv As DataGridView = CType(sender, DataGridView)

        ' 3列目の幅を取得して、2列目の幅に足す
        rect.Width += dgv.Columns(2).Width

        ' 矩形の位置を補正
        rect.X -= 1
        rect.Y -= 2

        ' 背景、枠線、セルの値を描画
        Using brush As New SolidBrush(Color.AntiqueWhite)
            ' 背景の描画
            e.Graphics.FillRectangle(brush, rect)

            Using pen As New Pen(dgv.GridColor)
                ' 枠線の描画
                e.Graphics.DrawRectangle(pen, rect)
            End Using
        End Using

        Dim rect1 As Rectangle = New Rectangle()
        rect1.X = rect.X
        rect1.Y = rect.Y
        rect1.Width = rect.Width
        rect1.Height = CType(rect.Height / 2, Integer)

        Dim rect2 As Rectangle = New Rectangle()
        rect2.X = rect.X
        rect2.Y = rect.Y + CType(rect.Height / 2, Integer)
        rect2.Width = CType(rect.Width / 2, Integer)
        rect2.Height = CType(rect.Height / 2, Integer)

        Dim rect3 As Rectangle = New Rectangle()
        rect3.X = rect.X + CType(rect.Width / 2, Integer)
        rect3.Y = rect.Y + CType(rect.Height / 2, Integer)
        rect3.Width = CType(rect.Width / 2, Integer)
        rect3.Height = CType(rect.Height / 2, Integer)

        e.Graphics.DrawRectangle(Pens.Black, rect1)
        e.Graphics.DrawLine(Pens.Black, (rect.X + CType(rect.Width / 2, Integer)), 20, (rect.X + CType(rect.Width / 2, Integer)), 40)

        ' テキストの位置を調整
        rect.Y += 20
        ' セルに表示するテキストを描画

        TextRenderer.DrawText(e.Graphics,
                        "マスター",
                        e.CellStyle.Font,
                        rect1,
                        e.CellStyle.ForeColor,
                        TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter)
        TextRenderer.DrawText(e.Graphics,
            "カラム1",
            e.CellStyle.Font,
            rect2,
            e.CellStyle.ForeColor,
            TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter)
        TextRenderer.DrawText(e.Graphics,
           "カラム2",
           e.CellStyle.Font,
           rect3,
           e.CellStyle.ForeColor,
           TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter)
    End If

    ' 結合セル以外は既定の描画を行う
    If (e.ColumnIndex = 1 Or e.ColumnIndex = 2) = False Then
        e.Paint(e.ClipBounds, e.PaintParts)
    End If

    ' イベントハンドラ内で処理を行ったことを通知
    e.Handled = True
End Sub