VB.NET中DataGridViewTheme类致DataGridView2行高与DataGridView1不一致问题排查
问题:DataGridViewTheme类配置的行高与直接设置不一致
我尝试编写DataGridViewTheme类统一设置DataGridView的主题样式,但使用该类配置的DataGridView2,其行高与直接配置的DataGridView1不一致,尽管两者的设置代码完全相同。相关代码及解决方案如下:
原代码展示
Form1代码
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load DataGridView1.AllowUserToResizeRows = False DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill DataGridView1.BorderStyle = BorderStyle.None DataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None DataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None DataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft DataGridView1.ColumnHeadersDefaultCellStyle.Font = New Font("Segoe UI Semibold", 10.0F, System.Drawing.FontStyle.Bold) DataGridView1.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True DataGridView1.ColumnHeadersHeight = 40 DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing DataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft DataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.False DataGridView1.DefaultCellStyle.Font = New Font("Segoe UI", 10.0F) DataGridView1.EnableHeadersVisualStyles = False DataGridView1.RowHeadersVisible = False DataGridView1.RowHeadersWidth = 40 DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing DataGridView1.RowTemplate.Height = 40 DataGridView1.RowTemplate.Resizable = DataGridViewTriState.False DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect For i As Integer = 0 To 3 DataGridView1.Rows.Add(New Object() {"Column 1", "Column 2", "Column 3"}) Next i 'set theme DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(210, 232, 254) DataGridView1.AlternatingRowsDefaultCellStyle.ForeColor = Color.Black DataGridView1.AlternatingRowsDefaultCellStyle.SelectionBackColor = Color.LightSkyBlue DataGridView1.AlternatingRowsDefaultCellStyle.SelectionForeColor = Color.Black DataGridView1.BackgroundColor = Color.FromArgb(248, 251, 254) DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(30, 144, 254) DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White DataGridView1.ColumnHeadersDefaultCellStyle.SelectionBackColor = Color.FromArgb(30, 144, 254) DataGridView1.ColumnHeadersDefaultCellStyle.SelectionForeColor = Color.White DataGridView1.DefaultCellStyle.BackColor = Color.FromArgb(248, 251, 254) DataGridView1.DefaultCellStyle.ForeColor = Color.Black DataGridView1.DefaultCellStyle.SelectionBackColor = Color.LightSkyBlue DataGridView1.DefaultCellStyle.SelectionForeColor = Color.Black For i As Integer = 0 To 3 DataGridView2.Rows.Add(New Object() {"Column 1", "Column 2", "Column 3"}) Next i Dim lightTheme As New DataGridViewTheme(DataGridView2, DataGridViewTheme.Theme.Light) End Sub End Class
DataGridViewTheme类代码
Public Class DataGridViewTheme Public Enum Theme Light End Enum Public Sub New(ByVal dgv As DataGridView, ByVal Theme As Theme) dgv.AllowUserToResizeRows = False dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill dgv.BorderStyle = BorderStyle.None dgv.CellBorderStyle = DataGridViewCellBorderStyle.None dgv.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft dgv.ColumnHeadersDefaultCellStyle.Font = New Font("Segoe UI Semibold", 10.0F, System.Drawing.FontStyle.Bold) dgv.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True dgv.ColumnHeadersHeight = 40 dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing dgv.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft dgv.DefaultCellStyle.WrapMode = DataGridViewTriState.False dgv.DefaultCellStyle.Font = New Font("Segoe UI", 10.0F) dgv.EnableHeadersVisualStyles = False dgv.RowHeadersVisible = False dgv.RowHeadersWidth = 40 dgv.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing dgv.RowTemplate.Height = 40 dgv.RowTemplate.Resizable = DataGridViewTriState.False dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect Select Case Theme Case DataGridViewTheme.Theme.Light Light(dgv) Case Else End Select End Sub Private Sub Light(ByVal dgv As DataGridView) dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(210, 232, 254) dgv.AlternatingRowsDefaultCellStyle.ForeColor = Color.Black dgv.AlternatingRowsDefaultCellStyle.SelectionBackColor = Color.LightSkyBlue dgv.AlternatingRowsDefaultCellStyle.SelectionForeColor = Color.Black dgv.BackgroundColor = Color.FromArgb(248, 251, 254) dgv.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(30, 144, 254) dgv.ColumnHeadersDefaultCellStyle.ForeColor = Color.White dgv.ColumnHeadersDefaultCellStyle.SelectionBackColor = Color.FromArgb(30, 144, 254) dgv.ColumnHeadersDefaultCellStyle.SelectionForeColor = Color.White dgv.DefaultCellStyle.BackColor = Color.FromArgb(248, 251, 254) dgv.DefaultCellStyle.ForeColor = Color.Black dgv.DefaultCellStyle.SelectionBackColor = Color.LightSkyBlue dgv.DefaultCellStyle.SelectionForeColor = Color.Black dgv.Refresh() End Sub End Class
问题原因
DataGridView的RowTemplate.Height仅对设置之后添加的行生效。你的代码中:
- DataGridView1是先设置
RowTemplate.Height = 40,再添加行,所有行都继承了40的高度 - DataGridView2是先添加行,再通过Theme类设置
RowTemplate.Height,已存在的行不会自动更新高度,导致行高不一致
修复方案
方案1:调整执行顺序(推荐)
先初始化DataGridViewTheme,再添加行,让新行直接继承RowTemplate的高度:
' 修改Form1_Load中的DataGridView2代码段 Dim lightTheme As New DataGridViewTheme(DataGridView2, DataGridViewTheme.Theme.Light) For i As Integer = 0 To 3 DataGridView2.Rows.Add(New Object() {"Column 1", "Column 2", "Column 3"}) Next i
方案2:兼容已存在的行
在Theme类中设置RowTemplate后,遍历所有已存在的行手动设置高度:
' 修改DataGridViewTheme的New方法 Public Sub New(ByVal dgv As DataGridView, ByVal Theme As Theme) ' ... 原有设置代码 ... dgv.RowTemplate.Height = 40 dgv.RowTemplate.Resizable = DataGridViewTriState.False ' 新增:手动更新已存在的行高度 For Each row As DataGridViewRow In dgv.Rows If Not row.IsNewRow Then row.Height = 40 End If Next ' ... 后续主题设置代码 ... End Sub
内容的提问来源于stack exchange,提问作者dlaksmi
相关产品推荐
相关产品推荐

