DataGridView merge colunm header
Imports System.Windows.Forms Imports System.Drawing Imports Usac.Control Public Class ExDataGridView Inherits USGrid Public Sub New () MyBase .new() End Sub Public pBorderColor As Color = SystemColors.ControlDark <System.ComponentModel.Category( "カスタム" )> _ <System.ComponentModel.Description( "境界線のカラー" )> _ Public Property BorderColor() As Color Get Return pBorderColor End Get Set ( ByVal value As Color) pBorderColor = value End Set End Property Public pDokCell As New Generic.List(Of Integer ) <System.ComponentModel.Category( "カスタム" )> _ <System.ComponentModel.Description( "結合するヘッダーを設定する値 設定する値は1列目から2列分、4列目から3列分結合であれば 2,0,0,3というふうに設定 Generic.List型 " )> _ Public Property DockingCell() As Generic.List(Of Integer ) Get Return pDokCell End Get Set ( ByVal value As Generic.List(Of Integer )) pDokCell = value End Set End Property Public pHedTXT() As String <System.ComponentModel.Category( "カスタム" )> _ <System.ComponentModel.Description( "上部ヘッダーテキストです 1列目から2列分結合した部分のテキストを" "A" "4列目から3列分結合させた部分のテキストを" "B" "とする場合 A、空白、空白、B というふうに設定" & _ " 空白に設定している列は元のヘッダーテキストが表示される" )> _ Public Property FullHedTxt() As String () Get Return pHedTXT End Get Set ( ByVal value As String ()) pHedTXT = value End Set End Property Private Sub Me_CellPainting( ByVal sender As Object , ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles Me .CellPainting MergeCell(e, pDokCell) End Sub Public Function HedTxtSet() As ArrayList Dim arry As New ArrayList Dim cel As New ArrayList Dim col As Integer = Me .ColumnCount - 1 For i As Integer = 0 To col arry(i) = Me .Columns(i).HeaderText Next For Each d As Integer In DockingCell For ii As Integer = d To d + DockingCell(d) - 1 arry(d) = FullHedTxt(d) Next Next Return arry End Function Public Event HedPaint() Private Sub aaExDataGridView_v6_HedPaint() Handles Me .HedPaint Dim dok As Integer = 0 For Each d As Integer In DockingCell If d > 1 Then dok = 1 End If Next If dok = 1 Then Me .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing Me .ColumnHeadersHeight = 40 End If End Sub Private Sub MergeCell( ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs, _ ByVal Dokcell As Generic.List(Of Integer )) RaiseEvent HedPaint() If Dokcell Is Nothing Then Exit Sub If e.ColumnIndex >= 0 AndAlso e.RowIndex = -1 Then Dim cWid As New Hashtable Dim ww As Integer For iii As Integer = 0 To CInt (Dokcell.Count) - 1 ww = 0 If Dokcell(iii) <> Nothing Then For id As Integer = iii To iii + Dokcell(iii) - 1 ww = ww + Me .Columns(id).Width Next cWid(iii + Dokcell(iii) - 1) = ww End If Next Dim txt As String = CStr (e.Value) Dim DokSetMain As New ArrayList Dim DokSub As New ArrayList Dim DokTxt As New Hashtable Dim HedTX As New Hashtable Dim cc As Integer For Each d As Integer In Dokcell If d > 0 Then Dim int As Integer = cc + d - 1 DokSetMain.Add(int) DokTxt(int) = Me .Columns(cc).HeaderCell.Value Dim max As Integer If Not FullHedTxt Is Nothing Then max = FullHedTxt.Length End If If cc < max Then HedTX(int) = FullHedTxt(cc) End If If d > 0 Then For i As Integer = cc To cc + d - 1 DokSub.Add(i) Next End If End If cc += 1 Next Dim col As Integer = e.ColumnIndex Dim x2 As Integer = e.CellBounds.X Dim Y2 As Integer = e.CellBounds.Y Dim hei As Integer = CInt (e.CellBounds.Height / 2) Dim wid As Integer = e.CellBounds.Width Dim backBrush As New SolidBrush(e.CellStyle.BackColor) Dim newRect As New Rectangle(e.CellBounds.X, e.CellBounds.Y, _ e.CellBounds.Width - 1, e.CellBounds.Height - 1) Dim backColorBrush As New SolidBrush(e.CellStyle.BackColor) Dim gridBrush As New SolidBrush( Me .GridColor) Dim gridLinePen As New Pen(gridBrush) Dim BoPen As New Pen(BorderColor) Dim Bou1 As New Rectangle( _ x2 - 1, _ Y2 + hei, _ wid, _ hei - 1) Try 'ドッキングセル上段 If DokSetMain.Contains(col) = True Then e.Graphics.FillRectangle(backBrush, e.CellBounds) Dim Bou2 As New Rectangle(x2 - 1, _ Y2 + hei - 1, _ wid, _ hei) With e.Graphics .DrawString( CStr (e.Value), e.CellStyle.Font, Brushes.Black, _ x2 + 2, Y2 + hei + 2, _ StringFormat.GenericDefault) .DrawLine(Pens.White, x2, Y2 + hei, x2, Y2 + hei + hei - 1) .DrawLine(Pens.White, x2, Y2 + hei, x2 + wid - 1, Y2 + hei) End With txt = HedTX(col) If txt Is Nothing OrElse txt = "" Then txt = CStr (DokTxt(col)) End If Dim wid2 As Integer = CInt (cWid(col)) x2 = x2 - (wid2 - wid) Bou1 = New Rectangle(x2 - 1, _ Y2, _ wid2, _ hei - 1) With e.Graphics .DrawRectangle(BoPen, Bou1) .DrawRectangle(BoPen, Bou2) .DrawString(txt, e.CellStyle.Font, Brushes.Black, _ x2 + 2, Y2 + 2, _ StringFormat.GenericDefault) .DrawLine(Pens.White, x2, Y2 + 1, x2, Y2 + hei - 1) .DrawLine(Pens.White, x2, Y2 + 1, x2 + wid2 - 1, Y2 + 1) End With e.Handled = True Else 'ドッキングセル以外 If DokSub.Contains(col) = False Then e.Graphics.FillRectangle(backBrush, e.CellBounds) Bou1 = New Rectangle(x2 - 1, _ Y2, _ wid, _ hei * 2 - 1) e.Graphics.DrawRectangle(BoPen, Bou1) Dim max As Integer = 0 If Not FullHedTxt Is Nothing Then max = FullHedTxt.Length End If Dim txt3 As String = Nothing If col < max Then txt3 = FullHedTxt(col) End If If Not txt3 Is Nothing AndAlso txt3 <> "" Then txt = txt3 Else txt = CStr (e.Value) End If With e.Graphics .DrawString(txt, e.CellStyle.Font, Brushes.Black, _ x2 + 2, Y2 + 8 + 2, _ StringFormat.GenericDefault) .DrawLine(Pens.White, x2, Y2 + 1, x2, Y2 + hei * 2 - 1) .DrawLine(Pens.White, x2, Y2 + 1, x2 + wid - 1, Y2 + 1) End With e.Handled = True Else 'ドッキングセル下段 Bou1 = New Rectangle(x2 - 1, _ Y2 + hei - 1, _ wid, _ hei) With e.Graphics .FillRectangle(backBrush, e.CellBounds) .DrawRectangle(BoPen, Bou1) .DrawString( CStr (e.Value), e.CellStyle.Font, Brushes.Black, _ x2 + 2, Y2 + hei + 2, _ StringFormat.GenericDefault) .DrawLine(Pens.White, x2, Y2 + hei, x2, Y2 + hei * 2) .DrawLine(Pens.White, x2, Y2 + hei, x2 + wid - 1, Y2 + hei) End With e.Handled = True End If End If Finally BoPen.Dispose() backColorBrush.Dispose() gridLinePen.Dispose() gridBrush.Dispose() backBrush.Dispose() End Try End If End Sub End Class |
Sample
Private Sub ExDataGridView1_Scroll( ByVal sender As System. Object , ByVal e As System.Windows.Forms.ScrollEventArgs) Handles ExDataGridView1.Scroll Dim rtHeader As Rectangle = Me .Grd1.DisplayRectangle rtHeader.Height = Me .Grd1.ColumnHeadersHeight - 2 Me .Grd1.Invalidate(rtHeader) End Sub Private Sub ExDataGridView1_Resize( ByVal sender As System. Object , ByVal e As System.EventArgs) Handles ExDataGridView1.Resize Dim rtHeader As Rectangle = Me .Grd1.DisplayRectangle rtHeader.Height = Me .Grd1.ColumnHeadersHeight - 2 Me .Grd1.Invalidate(rtHeader) End Sub ExDataGridView1.Columns.Add( "a1" , "Team" ) ExDataGridView1.Columns.Add( "a2" , "Name" ) ExDataGridView1.Columns.Add( "a3" , "AB" ) ExDataGridView1.Columns.Add( "a4" , "BA" ) ExDataGridView1.Columns.Add( "a5" , "SLG" ) ExDataGridView1.Columns.Add( "a6" , "OPS" ) ExDataGridView1.Columns.Add( "a7" , "SO" ) ExDataGridView1.Columns.Add( "b1" , "A1" ) ExDataGridView1.Columns.Add( "b2" , "A2" ) ExDataGridView1.Columns.Add( "b3" , "A3" ) ExDataGridView1.Columns.Add( "b4" , "A4" ) ExDataGridView1.Columns.Add( "b5" , "A5" ) ExDataGridView1.Columns.Add( "b6" , "A6" ) ExDataGridView1.Columns.Add( "b7" , "A7" ) ExDataGridView1.Columns.Add( "b8" , "A8" ) ExDataGridView1.Columns(0).Width = 40 ExDataGridView1.Columns(1).Width = 40 ExDataGridView1.Columns(2).Width = 40 ExDataGridView1.Columns(3).Width = 40 ExDataGridView1.Columns(4).Width = 40 ExDataGridView1.Columns(5).Width = 40 ExDataGridView1.Columns(6).Width = 40 ExDataGridView1.Columns(7).Width = 40 ExDataGridView1.Columns(8).Width = 40 ExDataGridView1.Columns(9).Width = 40 ExDataGridView1.Columns(10).Width = 40 ExDataGridView1.Columns(11).Width = 40 ExDataGridView1.Columns(12).Width = 40 ExDataGridView1.Columns(13).Width = 40 ExDataGridView1.Columns(14).Width = 40 Dim GL As New Generic.List(Of Integer ) GL.Add(2) GL.Add(0) GL.Add(0) GL.Add(2) GL.Add(0) GL.Add(0) GL.Add(0) GL.Add(8) ExDataGridView1.ドッキングセル = GL Dim text() As String = { " Number One" , "" , "" , " Sluger!" , "" , "" , "" , "TEST" } ExDataGridView1.FullHedTxt = text ExDataGridView1.Rows.Add() ExDataGridView1(0, 0).Value = "SEA" ExDataGridView1(1, 0).Value = "Ichiro" ExDataGridView1(2, 0).Value = 438 ExDataGridView1(3, 0).Value = 0.345 ExDataGridView1(4, 0).Value = 0.543 ExDataGridView1(5, 0).Value = 0.876 ExDataGridView1(6, 0).Value = 25 ExDataGridView1(7, 0).Value = 1 ExDataGridView1(8, 0).Value = 2 ExDataGridView1(9, 0).Value = 3 ExDataGridView1(10, 0).Value = 4 ExDataGridView1(11, 0).Value = 5 ExDataGridView1(12, 0).Value = 6 ExDataGridView1(13, 0).Value = 7 ExDataGridView1(14, 0).Value = 8 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通