2010-06-25 8 views
0

J'ai du code pour modifier le comportement de la listbox. Je peux changer la couleur du texte, mais je suis incapable de changer la couleur de l'arrière-plan de chaque ligne.C# Listbox.DrawItem pour colorier chaque ligne

C'est dans une boucle pour chacun de mes lignes

LBLines est un tableau de magasin de chaîne dans une variable globale

if (LBLines[e.Index] != "None") 
{ 
     e.Graphics.FillRectangle(new SolidBrush(Color.FromName(LBLines[e.Index])), 
e.Bounds.X,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height); 
} 

Cela couleur toutes les lignes de la même couleur, même celles qui sont énumérées comme "Aucun", tu ce dont j'ai besoin est qu'ils restent la même couleur que la couleur de fond par défaut.

EDIT: Comparaison n'est pas le problème, le problème vient de l'e.Graphics.FillRectangle. Il semble colorer TOUS les espaces lignes, indépendamment de celui que je dessine.

EDIT2: Code modifié pour montrer que h était égal à e.Index

+1

Je vérifierais pour vous assurer que vous faites une comparaison correcte sur LBLines [h]! = "None" first' –

Répondre

3

Difficile à dire sans plus de contexte autour de votre code (la boucle, la méthode, ...), mais ce code fait ce que je pense ce que vous voulez:

public partial class Form1 : Form 
{ 
    string[] Colors { get; set; } 

    public Form1() 
    { 
     InitializeComponent(); 
     Colors = new string[] { "red", "blue", "white", "none", "orange" }; 
     listBox1.Items.AddRange(Colors); 
    } 

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     e.DrawBackground(); 
     if (Colors[e.Index] != "none") 
     { 
      using (var brush = new SolidBrush(Color.FromName(Colors[e.Index]))) 
      { 
       e.Graphics.FillRectangle(brush, e.Bounds); 
      } 
     } 
     e.Graphics.DrawString(Colors[e.Index], Font, SystemBrushes.ControlText, e.Bounds); 
    } 
} 

Notez que la propriété DrawStyle du ListBox est réglé sur OwnerDrawFixed.

+0

Oui, j'ai enlevé la boucle mais il n'a pas arrangé la chose. – Wildhorn

+0

Vous pouvez également faire e.DrawBackground() lorsque la chaîne est "None" ... –

+0

Non, il semble que l'arrière-plan le fait pour TOUTES les lignes. C'est bizarre parce que DrawString fonctionne très bien. – Wildhorn