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

DevExpress XtraGrid样式失效:未读邮件行加粗后点击恢复正常

我来帮你拆解这个问题的根源,再给你几个靠谱的解决办法:

问题出在哪?

你遇到的样式消失问题,核心原因有两个:

  • 你用的是Appearance.SelectedRow来设置加粗样式,但这个属性只对当前处于选中状态的行生效。当你点击网格里的其他行,原来的未读邮件行就不再是选中状态了,自然会回到默认的非选中行样式,加粗效果也就没了。
  • 你的代码是在窗体加载时一次性遍历设置,但XtraGrid有自己的自动渲染机制——只要网格发生交互(点击、滚动、数据刷新),就会重新绘制所有行,这时候你之前手动设置的一次性样式会被系统默认样式覆盖。
解决建议

下面是几种从易到难、从推荐到不推荐的方案,你可以根据需求选:

方案1:用GridView的RowStyle事件(最推荐)

这是DevExpress官方推荐的自定义行样式的方式,每次行绘制时都会触发这个事件,不管是初始化还是用户交互后,都能稳定保持样式。直接替换你原来的代码就行:

Private Sub gridvwIncEmailsList_RowStyle(sender As Object, e As RowStyleEventArgs) Handles gridvwIncEmailsList.RowStyle
    ' 跳过表头、新行这些非数据行
    If e.RowHandle < 0 Then Return

    ' 获取当前行的IsRead值(用列名比索引更靠谱,避免列顺序变了出错)
    Dim isRead As Boolean = CBool(gridvwIncEmailsList.GetRowCellValue(e.RowHandle, "IsRead"))

    ' 未读邮件设置加粗样式
    If Not isRead Then
        e.Appearance.Font = New Font("Tahoma", 10.0F, FontStyle.Bold)
        e.Appearance.ForeColor = Color.Black
        e.Appearance.BackColor = Color.White
    Else
        ' 已读邮件恢复默认样式,避免互相影响
        e.Appearance.Reset()
    End If
End Sub

注意:要确保这个事件已经和GridView绑定(可以在设计器里选GridView的事件列表找到RowStyle,然后关联这个方法)。

方案2:用可视化的条件格式(不用写代码)

如果你不想碰代码,DevExpress提供了可视化的条件格式功能:

  • 打开GridView的设计器,找到左侧的Format Rules选项
  • 点击Add按钮,选择Format Rule Expression
  • 在表达式编辑器里输入[IsRead] = False
  • 点击Format按钮,在弹出的窗口里设置字体为加粗、前景色黑色、背景色白色
  • 保存设置后,网格会自动根据IsRead的值应用样式,完全不用手动遍历,交互后样式也不会消失

方案3:修正你原来的代码(临时应急方案,不推荐)

如果你非要沿用原来的遍历思路,那不能用SelectedRow的外观,得改成设置行的默认外观,但这种方式不够稳定,网格刷新时可能还是会失效:

Private Sub IsReadEmails_BoldFont()
    ' 注意循环边界:RowHandle从0到RowCount-1,原来的循环会越界
    For i As Integer = 0 To gridvwIncEmailsList.RowCount - 1
        Dim isRead As Boolean = CBool(gridvwIncEmailsList.GetRowCellValue(i, gridvwIncEmailsList.Columns(13)))
        If Not isRead Then
            ' 设置行的默认外观,而不是选中行的外观
            gridvwIncEmailsList.GetRowAppearance(i).Font = New Font("Tahoma", 10.0F, FontStyle.Bold)
            gridvwIncEmailsList.GetRowAppearance(i).ForeColor = Color.Black
            gridvwIncEmailsList.GetRowAppearance(i).BackColor = Color.White
        End If
    Next
End Sub

另外,你还得在网格的MouseDown、Scroll等事件里重新调用这个方法,才能保证样式不消失,所以还是不如前两个方案省心。

内容的提问来源于stack exchange,提问作者S3minaki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:11:20