绘制项目时列表框闪烁

ListBox Flicker When Drawing Items

我有一个带有列表框的表单,其中填充了 Excel 工作表中“A”列的内容。 “B”列代表“A”列中每个项目的数量。

列表框中的每一项颜色为灰色或黑色,具体取决于项目数量是零还是大于零。

问题是列表框经常闪烁,导致表单速度变慢。我试过将表单设置为双缓冲,但这似乎没有任何区别。

我希望有人能帮我解决这个问题。

Private Sub P_List_LB_DrawItem(sender As Object, e As System.Windows.Forms.DrawItemEventArgs) Handles P_List_LB.DrawItem

e.DrawBackground()

DataRange = WS.Range("B1:B20")
For Each cell In DataRange
  If cell.value <> "0" Then
    e.Graphics.DrawString(P_List_LB.Items(e.Index).ToString(), e.Font, System.Drawing.Brushes.Black, New System.Drawing.PointF(e.Bounds.X, e.Bounds.Y))
  Else
    e.Graphics.DrawString(P_List_LB.Items(e.Index).ToString(), e.Font, System.Drawing.Brushes.Gray, New System.Drawing.PointF(e.Bounds.X, e.Bounds.Y))
  End If
Next
End Sub

我并没有真正在 VB 中使用 Excel,所以我不确定您将如何获得单个单元格,但这就是您需要做的。沿着这些线的东西:

Dim rowNumber = e.Index + 1
Dim range = WS.Range($"B{rowNumber}:B{rowNumber}")

e.Graphics.DrawString(P_List_LB.Items(e.Index).ToString(),
                      e.Font,
                      If(range.Value = "0", Brushes.Gray, Brushes.Black),
                      New PointF(e.Bounds.X, e.Bounds.Y))

如果您想从评论中采纳我的建议并将颜色合并到项目中,那么您可以先构建一个包含数据和颜色的对象列表。同样,不确定如何使用 Excel 范围来做到这一点,但你可以解决这个问题:

Friend Class CustomListItem
    Public Property Text As String
    Public Property Color As Color
End Class

从您的范围创建该类型的对象列表,Text 从 A 列设置,Color 设置为 BlackGray ,取决于 B 列中的值。将该列表绑定到 ListBox 并显示 Text:

P_List_LB.Items.DisplayMember = "Text"
P_List_LB.Items.DataSource = myListOfCustomListItem

您的代码将如下所示:

Dim item = DirectCast(P_List_LB.Items(e.Index), CustomListItem)

e.Graphics.DrawString(item.Text,
                      e.Font,
                      item.Color,
                      New PointF(e.Bounds.X, e.Bounds.Y))