В ответ на два ваших конкретных вопроса:
Код, который вы показали, обновляется бесконечно, потому что вы добавили вызов в Refresh
в конце:
lsbLog.Refresh()
Уберите это, и вы решите бесконечную проблему обновления.
Да, вы можете проверить заголовок элемента вместо его индекса, но такого свойства, как e.stringvalue
, не существует. Вам нужно будет сделать это по-другому, способом, который вы уже обнаружили и использовали в своем звонке на DrawString
:
lsbLog.Items(e.Index).ToString()
Возможно, вы захотите сделать что-то более сложное, чем я, в зависимости от того, что элементы обычно содержат. Например, вы можете проверить, содержит ли строка ключевые слова , вместо проверки на равенство. Для большей гибкости вам может потребоваться заменить Select Case
на оператор If
- Else
.
Итак, через несколько незначительных изменений я получаю следующий код:
Private Sub lsbLog_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles lsbLog.DrawItem
'//Draw the background of the ListBox control for each item.
'// Create a new Brush and initialize to a Black colored brush
'// by default.
e.DrawBackground()
Dim mybrush As Brush = Brushes.Black
'// Determine the color of the brush to draw each item based on
'//the index of the item to draw.
Select Case lsbLog.Items(e.Index).ToString
Case "Error"
mybrush = Brushes.Red
Case "Ready"
mybrush = Brushes.Blue
Case "Success"
mybrush = Brushes.Green
End Select
'//
'// Draw the current item text based on the current
'// Font and the custom brush settings.
'//
e.Graphics.DrawString(lsbLog.Items(e.Index).ToString(), _
e.Font, mybrush, e.Bounds, StringFormat.GenericDefault)
'//
'// If the ListBox has focus, draw a focus rectangle
'// around the selected item.
'//
e.DrawFocusRectangle()
End Sub
А вот как выглядит результат:
Конечно, чтобы полностью соответствовать вашим требованиям, вам также необходимо заполнить фон каждого элемента. Лучший способ сделать это - использовать что-то вроде следующего, но изменить цвет кисти соответственно:
e.Graphics.FillRectangle(Brushes.Coral, e.Bounds)