2010-03-31 57 views
29

Estoy tratando de cambiar el color de fondo de algunas filas en un ListBox. Tengo dos listas que tienen nombres y se muestran en un ListBox. La segunda lista tiene algunos valores similares a los primeros List. Al hacer clic en un botón, quiero buscar el ListBox y el segundo List, y cambiar el color del ListBox para los valores que aparecen en el List. Mi búsqueda en el ListBox es el siguiente:C#: cambiar el color de la fila del listbox?

for (int i = 0; i < listBox1.Items.Count; i++) 
{ 
    for (int j = 0; j < students.Count; j++) 
    { 
     if (listBox1.Items[i].ToString().Contains(students[j].ToString())) 
     { 
     } 
    } 
} 

Pero no sé qué método utilizar con el fin de cambiar la apariencia de una fila ListBox. Alguien puede ayudarme?

** EDIT: **

HI Escribí mi código como sigue:

private void ListBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    Graphics g = e.Graphics; 
    Brush myBrush = Brushes.Black; 
    Brush myBrush2 = Brushes.Red; 
    g.FillRectangle(new SolidBrush(Color.Silver), e.Bounds); 
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault); 
    for (int i = 0; i < listBox1.Items.Count; i++) 
    { 
     for (int j = 0; j < existingStudents.Count; j++) 
     { 
      if (listBox1.Items[i].ToString().Contains(existingStudents[j])) 
      { 
       e.Graphics.DrawString(listBox1.Items[i].ToString(), 
       e.Font, myBrush2, e.Bounds, StringFormat.GenericDefault); 
      } 
     } 
    } 
    e.DrawFocusRectangle(); 
} 

Ahora me llama la List en el ListBox, pero cuando hago clic en el botón en primer lugar, se muestra en rojo solo los estudiantes que están en el List y cuando hago clic en ListBox dibuja todos los elementos. Quiero que muestre todos los elementos, y cuando haga clic en el botón, se mostrarán todos los elementos y el elemento encontrado en el List en rojo. ¿Dónde está mi error?

+1

Draw usted mismo usando OwnerDraw: http://www.c-sharpcorner.com/UploadFile/sahuja/OwnerDrawListBox11212005014826AM/OwnerDrawListBox.aspx –

+1

posible duplicado de http://stackoverflow.com/questions/1243870/changing- selected-itms-color-in-a-listbox –

+0

Después de su actualización: al parecer no está obteniendo lo que le mostraron los contendientes anteriores. El método DrawItem _ dibuja un elemento_, no múltiples elementos. Necesitará manejar _equipo cada uno según sea necesario_, y ** no ** usar un bucle for para procesar _todos elementos. Eche un vistazo a la respuesta de Thomas Levesque o Justin para ver buenos ejemplos. –

Respuesta

20

me parece que la solución en lugar de utilizar ListBox Solía ​​ListView.It permite cambiar elementos de la lista BackColor.

private void listView1_Refresh() 
{ 
    for (int i = 0; i < listView1.Items.Count; i++) 
    { 
     listView1.Items[i].BackColor = Color.Red; 
     for (int j = 0; j < existingStudents.Count; j++) 
     { 
      if (listView1.Items[i].ToString().Contains(existingStudents[j])) 
      { 
       listView1.Items[i].BackColor = Color.Green; 
      } 
     } 
    } 
} 
2

Creo que tiene que dibujar los elementos de lista usted mismo para lograr esto.

Here's a post con el mismo tipo de pregunta.

20

Deberá dibujar el artículo usted mismo. Cambie DrawMode a OwnerDrawFixed y maneje el evento DrawItem.

/// <summary> 
/// Handles the DrawItem event of the listBox1 control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.Windows.Forms.DrawItemEventArgs"/> instance containing the event data.</param> 
private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    Graphics g = e.Graphics; 

    // draw the background color you want 
    // mine is set to olive, change it to whatever you want 
    g.FillRectangle(new SolidBrush(Color.Olive), e.Bounds); 

    // draw the text of the list item, not doing this will only show 
    // the background color 
    // you will need to get the text of item to display 
    g.DrawString(THE_LIST_ITEM_TEXT , e.Font, new SolidBrush(e.ForeColor), new PointF(e.Bounds.X, e.Bounds.Y)); 

    e.DrawFocusRectangle(); 
} 
+0

gracias por sus comentarios, pero ¿cómo voy a hacerlo? usar esta función? o donde? Cambié en propiedades de listbox a Drawmode = OwnerDrawFixed y en InitializeComponent() ¿tengo que corregir algo de think? o simplemente agregaré esta función a mi función Form1.cs y la llamará? – Ercan

+1

Soy un fan de diseño de VS. Por lo tanto, en el editor de formularios donde se encuentra su listbox vaya a la lista de eventos y cree un nuevo controlador para el evento DrawItem. Luego use el código anterior en su nuevo controlador de eventos. – Justin

+0

Para usar el manejador de elementos de dibujo: listBox1.DrawMode = DrawMode.OwnerDrawFixed; listBox1.DrawItem + = new DrawItemEventHandler (listBox1_DrawItem); – Harrichael

11

primer lugar el uso de este espacio de nombres:

using System.Drawing; 

Añadir esto en cualquier lugar en el formulario:

listBox.DrawMode = DrawMode.OwnerDrawFixed; 
listBox.DrawItem += listBox_DrawItem; 

Aquí es el Gestor de Eventos:

private void listBox_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 

    Graphics g = e.Graphics; 
    g.FillRectangle(new SolidBrush(Color.White), e.Bounds); 
    ListBox lb = (ListBox)sender; 
    g.DrawString(lb.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.Black), new PointF(e.Bounds.X, e.Bounds.Y)); 

    e.DrawFocusRectangle(); 
} 
-2

¿Qué tal

 MyLB is a listbox 

     Label ll = new Label(); 
     ll.Width = MyLB.Width; 
     ll.Content = ss; 
     if(///<some condition>///) 
      ll.Background = Brushes.LightGreen; 
     else 
      ll.Background = Brushes.LightPink; 
     MyLB.Items.Add(ll); 
+2

Es obvio que nunca probó ese código. No funciona. Ni siquiera compila. Parece que eres un programador de Java. En Java, se hace de esta manera. Pero C# es COMPLETAMENTE diferente. – Elmue

+0

¿Por qué esperabas que compilara? es meta código Bueno, he estado diseñando y escribiendo código por solo 50 años :) Obviamente, no lo contrataría si todo lo que puede hacer es buscar las respuestas de copiar y pegar. –

+2

Este código es una mierda. No puedes poner una etiqueta en un cuadro de lista. Muestra que no aprendiste la programación de C#, ni siquiera dentro de 50 años. – Elmue

Cuestiones relacionadas