绘制项目时列表框闪烁
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
设置为 Black
或 Gray
,取决于 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))
我有一个带有列表框的表单,其中填充了 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
设置为 Black
或 Gray
,取决于 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))