2009-11-29 9 views
7

Comment pouvez-vous modifier la couleur d'arrière-plan des en-têtes d'un ListView?Modifier la couleur d'arrière-plan des en-têtes Winform ListView

+1

vous devrez implémenter le dessin personnalisé en remplaçant l'événement Paint. –

+0

en remplaçant la méthode Paint ne fait rien sur un ListView. Vous devez utiliser le mécanisme OwnerDraw suggéré par @David. Rappelez-vous simplement que cela supprime tout style de votre contrôle d'en-tête - pas d'élément chaud, pas d'indicateurs de tri, pas d'arrière-plans dégradés. – Grammarian

Répondre

7

Vous pouvez faire cela en définissant la propriété OwnerDraw pour la vue de liste sur true.

Cela vous permet ensuite de fournir des gestionnaires d'événements pour les événements de dessin de la liste.

Il y a un exemple détaillé sur MSDN

est Ci-dessous quelques exemples de code pour définir la couleur d'en-tête rouge:

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

Je pense (mais je suis heureux d'être démentie) que, ensemble OwnerDraw true, vous devrez fournir également des gestionnaires pour les autres événements de tirage qui ont mises en œuvre par défaut comme indiqué ci-dessous:

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

J'ai certainement pas ma Naged pour faire le listview dessiner les éléments sans cela.

+0

Comme un mot d'avertissement, parce qu'il m'a fallu plus d'une heure pour le comprendre, ne mettez pas une commande MSGBOX à l'intérieur du drawcolumnheader! Il bloque vb.net - cela a bien fonctionné autrement – cardmagik

5

Je sais que c'est un peu tard pour la fête mais j'ai quand même vu ce post et cela m'aurait aidé. Voici une petite application abstraite du code david fourni

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; 
} 

Ensuite, appelez dans votre constructeur de forme

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

Il suffit de remplacer la CLASSE NOM * * avec quelque classe que vous mettez le premier bit de code et les * QUELQUES COULEURS * avec une sorte de couleur.

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

Bonne chance à tous!