[C#] Cambiar color de un item [NO seleccionado] en un ListBox

Iniciado por Shell Root, 13 Septiembre 2013, 23:47 PM

0 Miembros y 1 Visitante están viendo este tema.

Shell Root

Lo necesito con el fin de identificar algunos items dentro del ListBox!

Estuve mirando y que carajos, estoy muy oxidado en C#  :-\, como se haría?
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.


Eleкtro

#2
Básicamente es lo que te ha comentado $Edu$, hacer la comparación inversa de como lo estés haciendo, pero un ListBox no contiene atributos para modificar lo que requieres. Sólamente puedes modificar el color de fondo dibujando manuálmente los items, y si encima quieres extender la funcionalidad para colorear ciertos Items eso requiere un poco más de código.

Yo te recomiendo que te olvides del ListBox y utilices un ListView, ya que se puede asemejar bastante a un ListBox si lo configuras corréctamente, y además puedes modificar el color de los item(s) que quieras sin necesidad de handlear los eventos de dibujo:





Código (vbnet) [Seleccionar]
   Dim Random_Color As New Random ' No es necesario, pero lo usaré en este ejemplo para colorear de forma aleatoria.

   Private Sub Test() ' Handles MyBase.Load

       ' Selecciono la vista "Detalles"
       ListView1.View = View.Details

       ' Agrego una columna
       ListView1.Columns.Add("Items:")

       ' Agrego unos cuantos items
       ListView1.Items.AddRange("A B C D E F".Split().Select(Function(x) New ListViewItem(x)).ToArray)

       ' Coloreo cada item de forma aleatoria:
       For Each Item As ListViewItem In ListView1.Items
           Item.BackColor = Color.FromArgb(Random_Color.Next(1, 999999999))
       Next

   End Sub



Item.BackColor = Color

Así de facil.







Pero bueno, si prefieres hacerlo con un ListBox, aquí te muestro un ejemplo que hice en VB.NET:


[youtube=640,360]http://www.youtube.com/watch?v=0W7iQMo1D1A[/youtube]


Código (vbnet) [Seleccionar]
   Public Class Form1

   ' Para seleccionar de forma rápida los items que quiero colorear
   Private Enum Colorize_ListBox_Items As Short
       Selected = 0
       Non_Selected = 1
       All = 2
       None = 3
   End Enum

   ' Aquí almaceno el color que usaré.
   Dim ListBox_Color As Brush

   Private Sub Test() Handles MyBase.Shown

       ' Añado unos cuantos Items
       ListBox1.Items.AddRange("A B C D E".Split())

       ' Selecciono un item
       ListBox1.SelectedIndex = (ListBox1.Items.Count \ 2)

       ' Seteo el modo de dibujo manual
       ListBox1.DrawMode = DrawMode.OwnerDrawFixed

       ' Coloreo el item seleccionado
       Colorize_Item(ListBox1, Colorize_ListBox_Items.Selected, Brushes.YellowGreen)

       ' ...O coloreo los items NO seleccionados
       Colorize_Item(ListBox1, Colorize_ListBox_Items.Non_Selected, Brushes.Red)

       ' ...O coloreo todos los items
       Colorize_Item(ListBox1, Colorize_ListBox_Items.Non_Selected, Brushes.Yellow)

       ' ...O no coloreo ningun item
       Colorize_Item(ListBox1, Colorize_ListBox_Items.None, Nothing)

       ' ...O coloreo algunos Items específicos
       Colorize_Item(ListBox1, {0, (ListBox1.Items.Count \ 2), (ListBox1.Items.Count - 1)}, Brushes.HotPink)

   End Sub

   Private Sub Colorize_Item(ByVal ListBox As ListBox, _
                             ByVal Items As Colorize_ListBox_Items, _
                             ByVal Brush_Color As Brush)

       ' En la propiedad "Tag" almaceno el valor de la enumeración.
       ListBox.Tag = Items.ToString

       ' Almaceno el color
       ListBox_Color = Brush_Color

       ListBox.Invalidate() ' Refresco los cambios

   End Sub

   Private Sub Colorize_Item(ByVal ListBox As ListBox, _
                             ByVal Items As Integer(), _
                             ByVal Brush_Color As Brush)

       ' En la propiedad "Tag" almaceno los índices de los items.
       ListBox.Tag = String.Join(ChrW(Keys.Space), Items)

       ' Almaceno el color
       ListBox_Color = Brush_Color

       ListBox.Invalidate() ' Refresco los cambios

   End Sub

   Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) _
   Handles ListBox1.DrawItem

       e.DrawBackground()

       Select Case sender.tag

           Case Colorize_ListBox_Items.Selected.ToString ' Colorize Selected Items

               If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
                   e.Graphics.FillRectangle(ListBox_Color, e.Bounds)
               End If

           Case Colorize_ListBox_Items.Non_Selected.ToString ' Colorize Non-Selected Items

               If (e.State And DrawItemState.Selected) = DrawItemState.None Then
                   e.Graphics.FillRectangle(ListBox_Color, e.Bounds)
               End If

           Case Colorize_ListBox_Items.All.ToString ' Colorize all

               e.Graphics.FillRectangle(ListBox_Color, e.Bounds)

           Case Colorize_ListBox_Items.None.ToString ' Colorize none

               Dim DefaultColor As SolidBrush = New SolidBrush(ListBox.DefaultBackColor)
               e.Graphics.FillRectangle(DefaultColor, e.Bounds)
               DefaultColor.Dispose()

           Case Else ' Colorize at specific index

               If Not String.IsNullOrEmpty(sender.tag) _
               AndAlso sender.tag.ToString.Split.Contains(e.Index.ToString) Then

                   e.Graphics.FillRectangle(ListBox_Color, e.Bounds)

               End If

       End Select

       Using b As New SolidBrush(e.ForeColor)
           e.Graphics.DrawString(ListBox1.GetItemText(ListBox1.Items(e.Index)), e.Font, b, e.Bounds)
       End Using

       e.DrawFocusRectangle()

   End Sub

End Class



Ahora es tu trabajo intentar traducirlo a C# (Hay cnvertidores online), o esperar la respuesta de NovLucker o alguno de los grandes de C#.


Saludos!








Shell Root

Oka entiendo, intentaré con el ListView era mi otra opción :p
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.