es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo tener varios colores en una fila de ListView?

Estoy utilizando C#/Winforms.
Quiero tener un ListView con varias filas de color de fondo. Los colores están definidos por un ColorPicker. Mi código funciona, pero todas las filas tienen el mismo color.

Una breve explicación:
Si el usuario elige un color (debajo de “Cor (Clique aqui para alterar)” y hace clic en “Agregar color destacado”, se agrega a la lista con la siguiente línea:
lstHighlightColors.Items.Add(lblColorPicker.BackColor.ToString());
pero no puedo encontrar una solución para tener varios colores. Quiero llenar los rectángulos según el color que se haya elegido en esa fila.

Aquí está mi código:

            var highlightColorslst = lstHighlightColors.Items[e.ItemIndex];
            string text            = highlightColorslst.Text;
            text                   = text.Replace("Color", "");
            Brush myBrush          = new SolidBrush(lstHighlightColors.ForeColor);
            Pen rect               = new Pen(lblColorPicker.ForeColor);

        lstHighlightColors.Items[e.ItemIndex].BackColor = lblColorPicker.BackColor;
        Brush fillColor       = new SolidBrush(lstHighlightColors.Items[e.ItemIndex].BackColor);

        e.Graphics.DrawRectangle(rect, new Rectangle(e.Bounds.Left + 2, e.Bounds.Top + 2, 22, e.Bounds.Height - 4));
        e.Graphics.DrawString(text, new Font(FontFamily.GenericSansSerif, 8), myBrush, (e.Bounds.Left + 25), e.Bounds.Top + 2);
        e.Graphics.FillRectangle(fillColor, new Rectangle(e.Bounds.Left + 3, e.Bounds.Top + 3, 21, e.Bounds.Height - 5));

        e.DrawFocusRectangle();

Aquí hay una imagen del código funcionando:

enter image description here

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para tener múltiples colores de fondo en ListView, necesitarás almacenar la información del color para cada fila en una estructura de datos. Una forma de hacer esto es usar un Dictionary<int, color=""> para almacenar el color para cada índice de fila. Al dibujar los elementos de ListView, puedes comprobar si la fila actual tiene un color de fondo personalizado y usar ese color para dibujar el rectángulo y el relleno. Aquí tienes un fragmento de código actualizado que muestra este enfoque:

    // Define un diccionario para hacer un seguimiento de los colores personalizados para cada fila
    Dictionary<int, color=""> coloresPersonalizados = new Dictionary<int, color="">();
    
    private void lstHighlightColors_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
        var highlightColorslst = lstHighlightColors.Items[e.ItemIndex];
        string text = highlightColorslst.Text;
        text = text.Replace("Color", "");
        Brush myBrush = new SolidBrush(lstHighlightColors.ForeColor);
        Pen rect = new Pen(lblColorPicker.ForeColor);
    
        // Comprueba si esta fila tiene un color de fondo personalizado
        if (coloresPersonalizados.TryGetValue(e.ItemIndex, out Color colorPersonalizado))
        {
            e.Graphics.DrawRectangle(rect, new Rectangle(e.Bounds.Left + 2, e.Bounds.Top + 2, 22, e.Bounds.Height - 4));
            e.Graphics.FillRectangle(new SolidBrush(colorPersonalizado), new Rectangle(e.Bounds.Left + 3, e.Bounds.Top + 3, 21, e.Bounds.Height - 5));
        }
        else // Usa el color de fondo predeterminado para esta fila
        {
            e.Graphics.DrawRectangle(rect, new Rectangle(e.Bounds.Left + 2, e.Bounds.Top + 2, 22, e.Bounds.Height - 4));
            e.Graphics.FillRectangle(new SolidBrush(lstHighlightColors.BackColor), new Rectangle(e.Bounds.Left + 3, e.Bounds.Top + 3, 21, e.Bounds.Height - 5));
        }
        e.Graphics.DrawString(text, new Font(FontFamily.GenericSansSerif, 8), myBrush, (e.Bounds.Left + 25), e.Bounds.Top + 2);
    
        e.DrawFocusRectangle();
    }
    
    private void btnAddHighlightColor_Click(object sender, EventArgs e)
    {
        // Mostrar el cuadro de diálogo del selector de color
        if (colorPicker.ShowDialog() == DialogResult.OK)
        {
            // Agregar el nuevo color a ListView
            lstHighlightColors.Items.Add(colorPicker.Color.ToString());
    
            // Almacenar el color personalizado para este índice de fila en el diccionario
            coloresPersonalizados[lstHighlightColors.Items.Count - 1] = colorPicker.Color;
    
            // Actualizar ListView para aplicar el nuevo color
            lstHighlightColors.Refresh();
        }
    }
    

    Nota: Este código asume que el ListView lstHighlightColors está configurado como OwnerDraw = true para que puedas manejar el evento DrawItem.</int,></int,></int,>

Comments are closed.