Pregunta

Estoy usando un ListView en C # para hacer una cuadrícula. Me gustaría encontrar una manera de poder resaltar una celda específica, programáticamente. Solo necesito resaltar una celda.

Experimenté con subelementos dibujados por el propietario, pero al usar el código de abajo, obtengo celdas resaltadas, ¡pero no texto! ¿Hay alguna idea sobre cómo hacer que esto funcione? Gracias por tu ayuda.

//m_PC.Location is the X,Y coordinates of the highlighted cell.


void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    if ((e.ItemIndex == m_PC.Location.Y) && (e.Item.SubItems.IndexOf(e.SubItem) == m_PC.Location.X))
        e.SubItem.BackColor = Color.Blue;
    else
        e.SubItem.BackColor = Color.White;
    e.DrawBackground();
    e.DrawText();
}
¿Fue útil?

Solución

Puede hacer esto sin que el propietario dibuje la lista:

// create a new list item with a subitem that has white text on a blue background
ListViewItem lvi = new ListViewItem( "item text" );
lvi.UseItemStyleForSubItems = false;
lvi.SubItems.Add( new ListViewItem.ListViewSubItem( lvi,
    "subitem", Color.White, Color.Blue, lvi.Font ) );

Los argumentos de color para el constructor ListViewSubItem controlan el color de fondo y de primer plano del subelemento. Lo más importante que se debe hacer aquí es establecer UseItemStyleForSubItems en False en el elemento de la lista, de lo contrario, se ignorarán los cambios de color.

Creo que su solución de dibujo de propietario también habría funcionado, pero debe recordar cambiar el color del texto (en primer plano) cuando cambie el fondo a azul, de lo contrario el texto será difícil de ver.

Otros consejos

Lo descubrí. Aquí hay un código para alternar el resaltado de un subelemento específico.

listView1.Items[1].UseItemStyleForSubItems = false;
if (listView1.Items[1].SubItems[10].BackColor == Color.DarkBlue)
{
    listView1.Items[1].SubItems[10].BackColor = Color.White;
    listView1.Items[1].SubItems[10].ForeColor = Color.Black;
}
else
{
    listView1.Items[1].SubItems[10].BackColor = Color.DarkBlue;
    listView1.Items[1].SubItems[10].ForeColor = Color.White;
}

En mi caso, quería resaltar filas específicas, incluidos todos los campos. Así que cada fila en mi lista de vistas con " Medicare " en la primera columna se resalta la fila completa:

public void HighLightListViewRows(ListView xLst)
        {
            for (int i = 0; i < xLst.Items.Count; i++)
            {
                if (xLst.Items[i].SubItems[0].Text.ToString() == "Medicare")
                {
                    for (int x = 0; x < xLst.Items[i].SubItems.Count; x++)
                    {
                        xLst.Items[i].SubItems[x].BackColor = Color.Yellow;
                    }
                }
            }
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top