¿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:
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:Nota: Este código asume que el ListView
lstHighlightColors
está configurado comoOwnerDraw = true
para que puedas manejar el eventoDrawItem
.</int,></int,></int,>