我正在尝试使用FormatRow事件格式化ObjectListView中的一行,并根据值将整个行设置为不同的ForeColor,但是无济于事。

我的代码:

Private Sub lsv_OpenTickets_FormatRow(sender As Object, e As FormatRowEventArgs) Handles lsv_OpenTickets.FormatRow
    Dim tkt As Ticket = DirectCast(e.Model, Ticket)
    If tkt.due = "Overdue" Then
        e.Item.ForeColor = Color.FromArgb(252, 146, 156)
    End If
End Sub


似乎只是将行中的第一个Item设置为指定的颜色,而所有其他SubItem都使用默认颜色绘制。

如果我将代码更改为:

e.Item.BackColor = Color.FromArgb(252, 146, 156)


然后,它将整个行正确地绘制为背景色。它似乎不适用于ForeColor。

也许我做错了什么?还是错过了一些东西?

最佳答案

好的,事实证明,e.Item.ForeColor似乎只对行中的第一个SubItem应用了格式设置-并非所有SubItems都像我想的那样。不知道这是故意的还是错误的,或者我是否编写了错误的代码,但是对我来说,“项目”对应于整行,而“子项目”对应于单个单元格。

无论如何,为了解决我的问题,我将代码修改为以下内容:

Private Sub lsv_OpenTickets_FormatRow(sender As Object, e As FormatRowEventArgs) Handles lsv_OpenTickets.FormatRow
    Dim tkt As Ticket = DirectCast(e.Model, Ticket)
    If tkt.due = "OVERDUE" Then
        For Each sb As OLVListSubItem In e.Item.SubItems
            sb.ForeColor = Color.FromArgb(252, 146, 159)
        Next
    End If
End Sub


现在,这为我提供了所需的结果,并且也与FormatCell事件配合使用,因为单个单元格格式将覆盖行格式。

10-06 02:29