Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Shell Root en 13 Septiembre 2013, 23:47 pm



Título: [C#] Cambiar color de un item [NO seleccionado] en un ListBox
Publicado por: Shell Root en 13 Septiembre 2013, 23:47 pm
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?


Título: Re: [C#] Cambiar color de un item [NO seleccionado] en un ListBox
Publicado por: $Edu$ en 14 Septiembre 2013, 02:35 am
If NOT


Título: Re: [C#] Cambiar color de un item [NO seleccionado] en un ListBox
Publicado por: Eleкtro en 14 Septiembre 2013, 05:32 am
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:

(http://img19.imageshack.us/img19/2321/hnvr.png)



Código
  1.    Dim Random_Color As New Random ' No es necesario, pero lo usaré en este ejemplo para colorear de forma aleatoria.
  2.  
  3.    Private Sub Test() ' Handles MyBase.Load
  4.  
  5.        ' Selecciono la vista "Detalles"
  6.        ListView1.View = View.Details
  7.  
  8.        ' Agrego una columna
  9.        ListView1.Columns.Add("Items:")
  10.  
  11.        ' Agrego unos cuantos items
  12.        ListView1.Items.AddRange("A B C D E F".Split().Select(Function(x) New ListViewItem(x)).ToArray)
  13.  
  14.        ' Coloreo cada item de forma aleatoria:
  15.        For Each Item As ListViewItem In ListView1.Items
  16.            Item.BackColor = Color.FromArgb(Random_Color.Next(1, 999999999))
  17.        Next
  18.  
  19.    End Sub


Código:
Item.BackColor = Color

Así de facil.






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


0W7iQMo1D1A


Código
  1.    Public Class Form1
  2.  
  3.    ' Para seleccionar de forma rápida los items que quiero colorear
  4.    Private Enum Colorize_ListBox_Items As Short
  5.        Selected = 0
  6.        Non_Selected = 1
  7.        All = 2
  8.        None = 3
  9.    End Enum
  10.  
  11.    ' Aquí almaceno el color que usaré.
  12.    Dim ListBox_Color As Brush
  13.  
  14.    Private Sub Test() Handles MyBase.Shown
  15.  
  16.        ' Añado unos cuantos Items
  17.        ListBox1.Items.AddRange("A B C D E".Split())
  18.  
  19.        ' Selecciono un item
  20.        ListBox1.SelectedIndex = (ListBox1.Items.Count \ 2)
  21.  
  22.        ' Seteo el modo de dibujo manual
  23.        ListBox1.DrawMode = DrawMode.OwnerDrawFixed
  24.  
  25.        ' Coloreo el item seleccionado
  26.        Colorize_Item(ListBox1, Colorize_ListBox_Items.Selected, Brushes.YellowGreen)
  27.  
  28.        ' ...O coloreo los items NO seleccionados
  29.        Colorize_Item(ListBox1, Colorize_ListBox_Items.Non_Selected, Brushes.Red)
  30.  
  31.        ' ...O coloreo todos los items
  32.        Colorize_Item(ListBox1, Colorize_ListBox_Items.Non_Selected, Brushes.Yellow)
  33.  
  34.        ' ...O no coloreo ningun item
  35.        Colorize_Item(ListBox1, Colorize_ListBox_Items.None, Nothing)
  36.  
  37.        ' ...O coloreo algunos Items específicos
  38.        Colorize_Item(ListBox1, {0, (ListBox1.Items.Count \ 2), (ListBox1.Items.Count - 1)}, Brushes.HotPink)
  39.  
  40.    End Sub
  41.  
  42.    Private Sub Colorize_Item(ByVal ListBox As ListBox, _
  43.                              ByVal Items As Colorize_ListBox_Items, _
  44.                              ByVal Brush_Color As Brush)
  45.  
  46.        ' En la propiedad "Tag" almaceno el valor de la enumeración.
  47.        ListBox.Tag = Items.ToString
  48.  
  49.        ' Almaceno el color
  50.        ListBox_Color = Brush_Color
  51.  
  52.        ListBox.Invalidate() ' Refresco los cambios
  53.  
  54.    End Sub
  55.  
  56.    Private Sub Colorize_Item(ByVal ListBox As ListBox, _
  57.                              ByVal Items As Integer(), _
  58.                              ByVal Brush_Color As Brush)
  59.  
  60.        ' En la propiedad "Tag" almaceno los índices de los items.
  61.        ListBox.Tag = String.Join(ChrW(Keys.Space), Items)
  62.  
  63.        ' Almaceno el color
  64.        ListBox_Color = Brush_Color
  65.  
  66.        ListBox.Invalidate() ' Refresco los cambios
  67.  
  68.    End Sub
  69.  
  70.    Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) _
  71.    Handles ListBox1.DrawItem
  72.  
  73.        e.DrawBackground()
  74.  
  75.        Select Case sender.tag
  76.  
  77.            Case Colorize_ListBox_Items.Selected.ToString ' Colorize Selected Items
  78.  
  79.                If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
  80.                    e.Graphics.FillRectangle(ListBox_Color, e.Bounds)
  81.                End If
  82.  
  83.            Case Colorize_ListBox_Items.Non_Selected.ToString ' Colorize Non-Selected Items
  84.  
  85.                If (e.State And DrawItemState.Selected) = DrawItemState.None Then
  86.                    e.Graphics.FillRectangle(ListBox_Color, e.Bounds)
  87.                End If
  88.  
  89.            Case Colorize_ListBox_Items.All.ToString ' Colorize all
  90.  
  91.                e.Graphics.FillRectangle(ListBox_Color, e.Bounds)
  92.  
  93.            Case Colorize_ListBox_Items.None.ToString ' Colorize none
  94.  
  95.                Dim DefaultColor As SolidBrush = New SolidBrush(ListBox.DefaultBackColor)
  96.                e.Graphics.FillRectangle(DefaultColor, e.Bounds)
  97.                DefaultColor.Dispose()
  98.  
  99.            Case Else ' Colorize at specific index
  100.  
  101.                If Not String.IsNullOrEmpty(sender.tag) _
  102.                AndAlso sender.tag.ToString.Split.Contains(e.Index.ToString) Then
  103.  
  104.                    e.Graphics.FillRectangle(ListBox_Color, e.Bounds)
  105.  
  106.                End If
  107.  
  108.        End Select
  109.  
  110.        Using b As New SolidBrush(e.ForeColor)
  111.            e.Graphics.DrawString(ListBox1.GetItemText(ListBox1.Items(e.Index)), e.Font, b, e.Bounds)
  112.        End Using
  113.  
  114.        e.DrawFocusRectangle()
  115.  
  116.    End Sub
  117.  
  118. 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!


Título: Re: [C#] Cambiar color de un item [NO seleccionado] en un ListBox
Publicado por: Shell Root en 16 Septiembre 2013, 08:16 am
Oka entiendo, intentaré con el ListView era mi otra opción :p