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

Maglitee
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Dernière intervention
5 décembre 2004
- 10 oct. 2004 à 17:36 - Dernière réponse : cs_titounne
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
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 

Votre réponse

12 réponses

Meilleure réponse
cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 12 oct. 2004 à 12:02
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#

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_coq
cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 10 oct. 2004 à 18:47
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
MorpionMx
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 10 oct. 2004 à 20:33
0
Merci
DateTime.Now.ToString("dd'/'MM'/'yyyy")


Merci coq, je connaissais pas !

Mx
Commenter la réponse de MorpionMx
Maglitee
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Dernière intervention
5 décembre 2004
- 11 oct. 2004 à 12:37
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
cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 11 oct. 2004 à 13:25
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
Maglitee
Messages postés
9
Date d'inscription
lundi 26 juillet 2004
Dernière intervention
5 décembre 2004
- 11 oct. 2004 à 17:21
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
cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 11 oct. 2004 à 17:34
0
Merci
ah donc tu voudrais associer une couleur a chaque item ?

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

Maglitee
Commenter la réponse de Maglitee
cs_titounne
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
Dernière intervention
24 octobre 2005
- 20 oct. 2005 à 15:43
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
cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 22 oct. 2005 à 12:46
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
cs_titounne
Messages postés
2
Date d'inscription
jeudi 20 octobre 2005
Dernière intervention
24 octobre 2005
- 24 oct. 2005 à 09:21
0
Merci
Ôupssss...... non j'ai mis l'autre valeur.... ma souris a dut riper.

Merci beaucoup
Commenter la réponse de cs_titounne

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.