Changer le couleur d'un item dans une listbox [Résolu]

Signaler
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004
-
cs_titounne
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2005
-
Bonjour, j'ai un petit soucis :
Je chercher le moyen de changer la couleur du texte d'un item dans une listbox. Ce changement de couleur doit avoir lieu avec une condition sur une date. Sauriez vous comment je peux operer ce changement de couleur ?

Merci d'avance.

12 réponses

Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
dans ce cas profite du fait qu'un item est de type object

au lieu d'ajouter un string, ajoute une instance d'une classe de ce genre :
public class ListBoxItem
{
public ListBoxItem(string directory, bool isSynchro)
{
m_directory = directory;
m_isSynchro = isSynchro;
}

private string m_directory;
private bool m_isSynchro;

public string Directory
{
get
{
return m_directory;
}
}

public bool IsSynchro
{
get
{
return m_isSynchro;
}
}
}


et tu affectes à la propriété DisplayMember la valeur "Directory" pour que le ListBox affiche le répertoire

exemple de remplissage :
listBoxReps.BeginUpdate();
listBoxReps.Items.Clear();
foreach ( string rep in Directory.GetDirectories("C:\") )
{
// repertoire
string directory = rep;

// si le rep a été modifié aujourd'hui => synchro
bool isSynchro;
if ( Directory.GetLastWriteTime(rep).Date == DateTime.Now.Date )
isSynchro = true;
else
isSynchro = false;

ListBoxItem item = new ListBoxItem(directory, isSynchro);

listBoxReps.Items.Add(item);
}
listBoxReps.EndUpdate();


et les methodes deviennent donc qqch dans ce genre là :
private void listBoxReps_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
ListBox listBox = (ListBox)sender;
ListBoxItem item = (ListBoxItem)listBox.Items[e.Index];

Size size = e.Graphics.MeasureString(item.Directory, listBox.Font).ToSize();
e.ItemWidth = size.Width;
e.ItemHeight = size.Height;

// réglage du scroll horizontal si nécessaire
if ( listBox.HorizontalScrollbar  // si l'affichage du scroll est demandé
&& listBox.Width < e.ItemWidth  // si la largeur de l'item est supérieure à celle du controle
&& e.ItemWidth > listBox.HorizontalExtent  // si un réglage supérieur (item plus large deja mesuré) n'est pas déjà présent
)
{
listBox.HorizontalExtent = e.ItemWidth;
}
}


private void listBoxReps_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
ListBox listBox = (ListBox)sender;

// si l'item est sélectionné, fond bleu
if ( (e.State & DrawItemState.Selected) == DrawItemState.Selected )
{
e.Graphics.FillRectangle(Brushes.Blue, e.Bounds);
}
// sinon fond blanc
else
{
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
}

// dessin de l'item
ListBoxItem item = (ListBoxItem)listBox.Items[e.Index];
if ( item.IsSynchro )
e.Graphics.DrawString(item.Directory, listBox.Font, Brushes.Black, e.Bounds.X, e.Bounds.Y);
else
e.Graphics.DrawString(item.Directory, listBox.Font, Brushes.Red, e.Bounds.X, e.Bounds.Y);
}


Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
un petit exemple qui met la date du jour en rouge :

donner à la propriété DrawMode du ListBox la valeur OwnerDrawVariable
et s'abonner aux events MeasureItem et DrawItem

Code de la méthode associée à l'event MeasureItem du ListBox :
private void listBoxDates_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
ListBox listBox = (ListBox)sender;

Size size = e.Graphics.MeasureString(listBox.Items[e.Index].ToString(), listBox.Font).ToSize();
e.ItemWidth = size.Width;
e.ItemHeight = size.Height;

// réglage du scroll horizontal si nécessaire
if ( listBox.HorizontalScrollbar  // si l'affichage du scroll est demandé
&& listBox.Width < e.ItemWidth  // si la largeur de l'item est supérieure à celle du controle
&& e.ItemWidth > listBox.HorizontalExtent  // si un réglage supérieur (item plus large deja mesuré) n'est pas déjà présent
)
{
listBox.HorizontalExtent = e.ItemWidth;
}
}


Code de la méthode associée à l'event DrawItem du ListBox :
private void listBoxDates_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
ListBox listBox = (ListBox)sender;

// si l'item est sélectionné, fond bleu
if ( (e.State & DrawItemState.Selected) == DrawItemState.Selected )
{
e.Graphics.FillRectangle(Brushes.Blue, e.Bounds);
}
// sinon fond blanc
else
{
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
}

// si la date est celle d'aujourd'hui, texte en rouge
string date = listBox.Items[e.Index].ToString();
if ( date == DateTime.Now.ToString("dd'/'MM'/'yyyy") )
{
e.Graphics.DrawString(date, listBox.Font, Brushes.Red, e.Bounds.X, e.Bounds.Y);
}
// sinon texte en noir
else
{
e.Graphics.DrawString(date, listBox.Font, Brushes.Black, e.Bounds.X, e.Bounds.Y);
}
}


Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
42
DateTime.Now.ToString("dd'/'MM'/'yyyy")


Merci coq, je connaissais pas !

Mx
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004

Merci Coq, je vois maintenant comment proceder, une seule interrogation perdure, au chargemement de ma Form, je liste le contenu d'un repertoire, avec "ListBox.Items.Add()". Du coup, je ne vois pas comment interagir avec la methode DrawItem. Est-ce que vous voyez ce que je veux dire ?
Merci encore ...
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
euh, j'ai du mal a saisir ce que tu entend par interagir

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004

Je vais essaye de m'expliquer, je ne maîtrise pas le C#...
Quand j'ajoute un element dans ma listbox, je fais un listbox.items.add() et je voudrais avoir la possibilité que cet élément aie une couleur autre que le noir en cas de condition particuliere, mais pas tout le temps. Je ne vois pas comment faire avec la methode drawitem que vous mentionnez. C'est surement réalisable si j'arrive a passer ma chaine (element ajouté à la listbox) en parametre a drawitem... J'espère que vous comprendrez mieux.

Merci.

Maglitee.
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
ah donc tu voudrais associer une couleur a chaque item ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004

En gros oui, mon appli est une sorte de server, si l'item est synchro, je le met en noir, si l'item n'a pas été synchro, je le met en rouge ...
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004

Merci, je vais essayer de mettre ceci en application

Maglitee
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2005

Bonjour,

j'ai un problème pour mettre en couleur un item de listbox.

J'ai bien creer ma classe listboxitem, j'ai abonné ma listbox aux evenements cité (via les proprietes/les actions de la listbox dans le designer)

Mais je ne passe jamais dans la fonction listBox_DrawItem().

que doit je faire en plus?
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
As tu fait ceci ? :
"donner à la propriété DrawMode du ListBox la valeur OwnerDrawVariable"

/*
coq
MVP Visual C#
*/
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2005

Ôupssss...... non j'ai mis l'autre valeur.... ma souris a dut riper.

Merci beaucoup