2009-11-29 179 views
7

¿Cómo se puede cambiar el color de fondo de los encabezados de un ListView?Cambiar el color de fondo de los encabezados ListView de Winform

+1

tendrá que implementar un dibujo personalizado anulando el evento Paint. –

+0

anulando el método Paint no hace nada en un ListView. Necesita utilizar el mecanismo OwnerDraw que sugirió @David. Solo recuerde que al hacerlo, elimina todo el estilo del control de encabezado: no hay elemento activo, ni indicadores de orden, ni fondos degradados. – Grammarian

Respuesta

7

Puede hacer esto estableciendo la propiedad OwnerDraw para que la vista de lista sea verdadera.

Esto le permite proporcionar controladores de eventos para los eventos de sorteo de la lista.

Hay un ejemplo detallado sobre MSDN

A continuación se muestra un código de ejemplo para establecer el color de cabecera a rojo:

private void listView1_DrawColumnHeader(object sender, 
              DrawListViewColumnHeaderEventArgs e) 
    { 
     e.Graphics.FillRectangle(Brushes.Red, e.Bounds); 
     e.DrawText(); 
    } 

Creo (pero estoy feliz de estar equivocado) que con el conjunto OwnerDraw true, tendrá que proporcionar también manejadores para los otros eventos de sorteo que tienen implementaciones por defecto como se muestra a continuación:

private void listView1_DrawItem(object sender, 
            DrawListViewItemEventArgs e) 
    { 
     e.DrawDefault = true; 
    } 

Desde luego, no tengo ma para hacer que la vista de lista dibuje los elementos sin eso.

+0

Como advertencia, porque me llevó más de una hora descubrirlo, ¡no coloque un comando MSGBOX dentro del drawcolumnheader! Se cuelga vb.net, esto funcionó bien de otra manera – cardmagik

5

Sé que esto es un poco tarde para la fiesta, pero todavía vi esta publicación y esto me habría ayudado. Aquí es una pequeña aplicación abstraída del código David suministra

using System.Windows.Forms; 
using System.Drawing; 

//List view header formatters 
public static void colorListViewHeader(ref ListView list, Color backColor, Color foreColor) 
{ 
    list.OwnerDraw = true; 
    list.DrawColumnHeader += 
     new DrawListViewColumnHeaderEventHandler 
     (
      (sender, e) => headerDraw(sender, e, backColor, foreColor) 
     ); 
     list.DrawItem += new DrawListViewItemEventHandler(bodyDraw); 
} 
private static void headerDraw(object sender, DrawListViewColumnHeaderEventArgs e, Color backColor, Color foreColor) 
{ 
    e.Graphics.FillRectangle(new SolidBrush(backColor), e.Bounds); 
    e.Graphics.DrawString(e.Header.Text, e.Font, new SolidBrush(foreColor), e.Bounds); 
} 
private static void bodyDraw(object sender, DrawListViewItemEventArgs e) 
{ 
    e.DrawDefault = true; 
} 

A continuación, llamar a esto en su forma constructor

public Form() 
{ 
    InitializeComponent(); 
    *CLASS NAME*.colorListViewHeader(ref myListView, *SOME COLOR*, *SOME COLOR*); 
} 

basta con sustituir el nombre de la clase * * con cualquier clase de poner el primer bit de código en y el * ALGUNOS COLORES * con algún tipo de color.

//Some examples: 
Color.white 
SystemColors.ActiveCaption 
Color.FromArgb(0, 102, 255, 102); 

¡Buena suerte!

Cuestiones relacionadas