списки владельцев снятых предметов vb2008 - PullRequest
0 голосов
/ 15 марта 2011

Мне нужно нарисовать каждый элемент в списке на основе текста, который будет добавлен, или текста, который он содержит.Затем мне нужно поместить значок в начале списка, с двумя другими цветами и значками в зависимости от заданных мной слов, например,

  • Если элемент содержит текст ошибки, поместите ошибку(16x16px) в начале и нарисуйте фон светло-красным, а текст жирным темно-красным.

  • Если он содержит готовый или начальный текст, используйте светло-оранжевый фон итемно-жирный синий шрифт текста.

  • Если в нем содержится текст «ОК» или «Успех», используйте светло-зеленый фон и темно-жирный текст зеленого шрифта.

Как это сделать?

РЕДАКТИРОВАТЬ

Вот что у меня уже есть, но этот код, кажется, обновляется бесконечно.где мне нужно выбрать цвет - это значение e.index.Могу ли я изменить e.index на somthinf как e.stringvalue?

Private Sub lsbLog_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.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 = Brushes.Black

        '// Determine the color of the brush to draw each item based on 
        '//the index of the item to draw.
        Select Case e.Index
            Case 0
                mybrush = Brushes.Red
            Case 1
                mybrush = Brushes.Blue
            Case 2
                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()
        lsbLog.Refresh()
    End Sub

1 Ответ

1 голос
/ 15 марта 2011

В ответ на два ваших конкретных вопроса:

  1. Код, который вы показали, обновляется бесконечно, потому что вы добавили вызов в Refresh в конце:

    lsbLog.Refresh()
    

    Уберите это, и вы решите бесконечную проблему обновления.

  2. Да, вы можете проверить заголовок элемента вместо его индекса, но такого свойства, как 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

А вот как выглядит результат:

ListBox with owner drawn items


Конечно, чтобы полностью соответствовать вашим требованиям, вам также необходимо заполнить фон каждого элемента. Лучший способ сделать это - использовать что-то вроде следующего, но изменить цвет кисти соответственно:

e.Graphics.FillRectangle(Brushes.Coral, e.Bounds)
...