You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:40:54