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