Сделать разными цветами текст в ListBox

MACHOMAN

Нужно чтобы текст постоянно менял цвет в ListBox, как можно это осуществить?
Public Class Form1
    Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
        'Рисуем фон элемента управления ListBox для каждого элемента.
        e.DrawBackground()
        'Цвет кисти по умолчанию черный
        Dim myBrush As Brush = Brushes.Black
        'Задаем цвет для трех итемов
        Select Case e.Index
            Case 0
                myBrush = Brushes.Red
            Case 1
                myBrush = Brushes.Orange
            Case 2
                myBrush = Brushes.Purple
        End Select
        'Рисуем текст.
        e.Graphics.DrawString(ListBox1.Items(e.Index).ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault)
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListBox1.DrawMode = DrawMode.OwnerDrawFixed 'Задаем режим для рисования элемента
        ListBox1.Items.AddRange({"VB.NET", "C#.NET", "F#.NET"})
    End Sub
End Class
а при вводе нового теста он был другова цвета , вот так происходит
ListBox1.Items.Add(TextBox1.Text)
' Добавляем запись, с текстом, который введен в текст. поле
7 ответов

MACHOMAN

Public Class Form1
    Dim Col As New List(Of Color)
    Dim R As New Random
    Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
        'Рисуем фон элемента управления ListBox для каждого элемента.
        e.DrawBackground()
        'Цвет кисти по умолчанию черный
        Dim myBrush As Brush = Brushes.Black
        If e.Index > -1 Then
            myBrush = New SolidBrush(Col(e.Index))
            'Рисуем текст.
            e.Graphics.DrawString(ListBox1.Items(e.Index).ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault)
        End If
 
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListBox1.DrawMode = DrawMode.OwnerDrawFixed 'Задаем режим для рисования элемента
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ListBox1.Items.Add(TextBox1.Text)
        Col.Add(Color.FromArgb(R.Next(0, 256), R.Next(0, 256), R.Next(0, 256)))
    End Sub
End Class


MACHOMAN

ошибка Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. Имя параметра: indexкак исправить?


MACHOMAN

При этом коде происходит плавное изменение цвета в ListBox. как можно реализавать этот же эффект для каждой строчки отдельно. чтобы каждый раз при добавлении строчки в тест плавно менял свой цвет
Public Class Form1
   Dim G_z As New System.Threading.Thread(AddressOf G_start)
    Dim G_Col As Color
    Dim G_01 As Integer = 5
    Sub G_start()
        Do
            G_Col = Color.FromArgb(205, 255 - G_01 * 2.5, 0)
            ListBox1.ForeColor = G_Col
        Loop
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        G_z.Start()
        ListBox1.Items.Add(TextBox1.Text)
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        G_01 += 1
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Start()
    End Sub
End Class


MACHOMAN

ошибка Индекс за пределами диапазона
У меня что-то все про защищенную память пишет. А Вы попробуйте в кнопке строки 21 и 22 поменять местами. А то элемент добавляется, а цвет - нет.По второму коду не подскажу, там намечается какая-то жесть, имхо


MACHOMAN

Но ведь можно использовать ListView, где у каждого ListViewItem есть свойство ForeColor и BackColor.


MACHOMAN

Значение не может быть неопределенным. Имя параметра: brush что не так?
Public Class Form1
    Dim blue_message As Boolean = False ' Use Black or Blue Brush
    Dim AddMode As Boolean = False  ' Tells DrawItem that it is in Add to ListBox mode
    Dim intNewIndex As Integer ' The index of the new item to be added to the ListBox
    Dim arrColors(0 To 100) As Brush ' Space to save brush colors for each row in the ListBox
 
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        ListBox1.DrawMode = DrawMode.OwnerDrawFixed
    End Sub
 
    Private Sub listbox_add_Blue()
        blue_message = True
        AddMode = True
        intNewIndex = ListBox1.Items.Count
        ListBox1.Items.Add("Blue") ' adds the line to the list box
    End Sub
 
    Private Sub listbox_add_Black()
        blue_message = False
        AddMode = True
        intNewIndex = ListBox1.Items.Count
        ListBox1.Items.Add("Black") ' adds the line to the list box
    End Sub
 
    Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
        Dim myBrush As Brush = Brushes.Black
        e.DrawBackground()
        If AddMode AndAlso e.Index = intNewIndex Then
            If blue_message Then
                myBrush = Brushes.Blue
            End If
            e.Graphics.DrawString(ListBox1.Items(e.Index).ToString(), e.Font, myBrush, _
                e.Bounds, StringFormat.GenericDefault)
            If e.Index > arrColors.GetUpperBound(0) Then ' Is the array filled
                ReDim Preserve arrColors(0 To arrColors.Count + 100) ' Make some more room
            End If
            arrColors(e.Index) = myBrush ' Save which brush we used
            AddMode = False ' Finished drawing the new item (It is the last row of the ListBox
        Else
            e.Graphics.DrawString(ListBox1.Items(e.Index).ToString(), _
                e.Font, arrColors(e.Index), _
                e.Bounds, StringFormat.GenericDefault)
        End If
        e.DrawFocusRectangle()
    End Sub
 
  
 
   
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        listbox_add_Black()
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        listbox_add_Blue()
    End Sub
End Class


MACHOMAN

MACHOMAN, пользуйтесь отладкой. На каждый чих писать на форум - Вы так будете до старости прогу дописывать