基于单元格值的Listview背景色或前色

问题描述

是否有更好的方法来更改整个行的颜色?

For i = 2 To LRow
Set LstItem = UserForm1.lstInvoiceItems.ListItems.Add(Text:=rngdata.Cells(i,1).Value)
For j = 2 To ColCount
    LstItem.ListSubItems.Add Text:=rngdata.Cells(i,j).Value
Next j
If rngdata.Cells(i,2) = "" Then
    LstItem.ForeColor = vbRed
    LstItem.ListSubItems.Item(1).ForeColor = vbRed
    LstItem.ListSubItems.Item(2).ForeColor = vbRed
    LstItem.ListSubItems.Item(3).ForeColor = vbRed
    LstItem.ListSubItems.Item(4).ForeColor = vbRed
    LstItem.ListSubItems.Item(5).ForeColor = vbRed
    LstItem.ListSubItems.Item(6).ForeColor = vbRed
    LstItem.ListSubItems.Item(7).ForeColor = vbRed
End if
Next i

解决方法

这是与列表视图一起使用的编辑版本。我对它进行了替换,目的是您可以在数据全部填充后或在数据更新/添加/编辑后才调用它。它将遍历整个列表视图,并根据第一个单元格值或子项为整个行着色(请参见注释掉的If行)

对于实际的颜色编码,您要查看项目而不是每个子项目-如果更改父项目的原色,则其所有子项都将继承相同的设置

    Private Sub ColorCode()
    For i = 0 To ListView1.Items.Count - 1 'you don't want it looking at the blank last line
        If ListView1.Items(i).Text = 123 Then 'Change this to whatever critera you need to color code
            'If ListView1.Items(i).SubItems(3).Text = 5 Then 'Alternatively if you want to go by your sub item for criteria
            ListView1.Items.Item(i).ForeColor = Color.Red
        End If
    Next
    End Sub

下面的原始答案:

我不确定100%是否可以将其调整为使用列表视图,但是如果可以将控件更改为datagridview,则可以使用以下代码:

    For i = 0 To DataGridView1.Rows.Count - 1
        If DataGridView1.Rows(i).Cells(2).Value = "" Then
            DataGridView1.Rows(i).DefaultCellStyle.BackColor = vbRed
        End If
    Next

根据您的应用程序在做什么,我建议在列表视图上使用datagridview