Estoy tratando de cambiar el color de fondo de algunas filas en una ListBox. Tengo dos listas que tiene nombres y se muestra en un ListBox. La segunda lista tiene algunos valores similares a los de la primera List. Al hacer clic en un botón, quiero buscar la ListBox y la segunda List, y cambiar el color de la ListBox para los valores que aparecen en la List. Mi búsqueda en la ListBox es como sigue:

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é de qué método utilizar para cambiar la apariencia de un ListBox fila. ¿Alguien puede ayudarme?

**EDITAR: **

HOLA me escribió 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 atrae mi List en el ListBox, pero cuando hago clic en el primer botón, se muestra en rojo sólo los estudiantes que están en el List y cuando hago clic en el ListBox atrae a todos los elementos. Quiero que se mostrará a todos los elementos , y cuando hago clic en el botón se mostrará a todos los elementos y el elemento que se encuentra en la List en rojo. Donde está mi error?

  • Dibujar tú mismo usando OwnerDraw: c-sharpcorner.com/UploadFile/sahuja/…
  • posibles duplicados de stackoverflow.com/questions/1243870/…
  • Después de la actualización: al parecer, usted no está obteniendo lo que el anterior ms responden a continuación mostramos. El método DrawItem dibuja un elemento, no varios elementos. Usted va a necesitar para manejar cada elemento según sea necesario, y no utilizar un bucle for para procesar todos los elementos. Echa un vistazo a Thomas Levesque o de Justin respuesta para buenos ejemplos.
  • Pero si quiero mostrar dos récord en el listbox? Yo no podría hacer esto? 2 de 5 va a cambiar de color ,otros serán del mismo color.
  • ¿Cuál es su condición para un registro a cambiar de color y a los demás para mostrar el mismo color? ¿Cómo podría usted indicar mediante programación a la diferencia?
  • En mi programa voy a obtener direcciones mac de bluetooth para los estudiantes y compairing ellos con las direcciones mac en ese momento.En mi lixtbox antes de analizar la lista de todos los grupos de muestra .Después de escanear no debe ser de alta lited de estudiantes que existen en ese momento.Por esto estoy compaining Listbox1.los elementos[i].Contiene(existingstudents[i]). y este geves me los nombres de los estudiantes que son existentes en ese momento.Esta idea funciona, pero el cambio de color de la lista desplegable para spesific los usuarios no trabajar )_
  • Dibujar el texto después de la parte de atrás motivos porque el dibujo primero elimina la cadena de correo.DrawFocusRectangle(); e.Gráficos.Cordón de ajuste(listBox1.Los elementos[e.Índice].ToString(), e.De la fuente, myBrush, e.Límites, StringFormat.GenericDefault);
  • Posibles duplicados de color de Fondo de un elemento de ListBox (winforms)

InformationsquelleAutor Ercan | 2010-03-31

6 Comentarios

  1. 32

    Puedo encontrar la solución que en lugar de utilizar ListBox he utilizado ListView.Permite cambiar los 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. 22

    Es necesario dibujar el elemento de sí mismo. Cambiar el DrawMode a OwnerDrawFixed y manejar 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();
    }
    • gracias por el comentario pero, ¿cómo puedo usar esta función?o donde? He cambiado en propiedades de cuadro de lista para Drawmode = OwnerDrawFixed y en InitializeComponent() am tengo que corregir algunos piensan? o simplemente voy a añadir esta función a mi Form1.cs de la función y se va a llamar?
    • Soy un VS diseñador de ventilador. Así, en el editor de formularios donde listbox es ir en la lista de eventos y crear un nuevo controlador para el evento DrawItem. A continuación, utilice el código anterior en su nuevo controlador de eventos.
    • Para utilizar el empate elemento controlador: listBox1.DrawMode = DrawMode.OwnerDrawFixed; listBox1.DrawItem += new DrawItemEventHandler(listBox1_DrawItem);
  3. 15

    Primer uso de este espacio de Nombres:

    using System.Drawing;

    Agregar esto en cualquier lugar en el formulario:

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

    Aquí es el Controlador 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();
    }
  4. 0

    Puedo encontrar la solución para el listbox artículos de fondo a amarillo. He intentado de la siguiente solución para lograr la salida.

     for (int i = 0; i < lstEquipmentItem.Items.Count; i++)
                    {
                        if ((bool)ds.Tables[0].Rows[i]["Valid_Equipment"] == false)
                        {
                            lblTKMWarning.Text = "Invalid Equipment & Serial Numbers are highlited.";
                            lblTKMWarning.ForeColor = System.Drawing.Color.Red;
                            lstEquipmentItem.Items[i].Attributes.Add("style", "background-color:Yellow");
                            Count++;
                        }
    
                    }
  5. -4

    ¿

          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);
    • Es obvio que nunca se trató de ese código. No funciona. No incluso compilar. Parece que usted es un programador de Java. En Java se hace de esta manera. Pero C# es COMPLETAMENTE diferente.
    • ¿Por qué esperar a compilar? es meta de código. Bueno, he estado diseñando & escribir código por cerca de 50 años solo:) Obviamente yo no te contratan si todo lo que se puede hacer es mirar para copiar / pegar respuestas.
    • Este código se completa mierda. Usted no puede poner una etiqueta en un listbox. Esto demuestra que usted no aprender a programar en C#, ni siquiera dentro de 50 años.

Dejar respuesta

Please enter your comment!
Please enter your name here