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

Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004
- - Dernière réponse : cs_titounne
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2005
- 24 oct. 2005 à 09:21
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.
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
74
3
Merci
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#

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 185 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
74
1
Merci
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#
Commenter la réponse de cs_coq
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
39
0
Merci
DateTime.Now.ToString("dd'/'MM'/'yyyy")


Merci coq, je connaissais pas !

Mx
Commenter la réponse de MorpionMx
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004
0
Merci
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 ...
Commenter la réponse de Maglitee
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
74
0
Merci
euh, j'ai du mal a saisir ce que tu entend par interagir

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004
0
Merci
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.
Commenter la réponse de Maglitee
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
74
0
Merci
ah donc tu voudrais associer une couleur a chaque item ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004
0
Merci
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 ...
Commenter la réponse de Maglitee
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
5 décembre 2004
0
Merci
Merci, je vais essayer de mettre ceci en application

Maglitee
Commenter la réponse de Maglitee
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2005
0
Merci
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?
Commenter la réponse de cs_titounne
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
74
0
Merci
As tu fait ceci ? :
"donner à la propriété DrawMode du ListBox la valeur OwnerDrawVariable"

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2005
0
Merci
Ôupssss...... non j'ai mis l'autre valeur.... ma souris a dut riper.

Merci beaucoup
Commenter la réponse de cs_titounne