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

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

Répondre au sujet
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 12 oct. 2004 à 12:02
+3
Utile
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#
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 10 oct. 2004 à 18:47
+1
Utile
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 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 10 oct. 2004 à 20:33
0
Utile
DateTime.Now.ToString("dd'/'MM'/'yyyy")


Merci coq, je connaissais pas !

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

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

Maglitee
Commenter la réponse de Maglitee
cs_titounne 2 Messages postés jeudi 20 octobre 2005Date d'inscription 24 octobre 2005 Dernière intervention - 20 oct. 2005 à 15:43
0
Utile
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 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 22 oct. 2005 à 12:46
0
Utile
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 2 Messages postés jeudi 20 octobre 2005Date d'inscription 24 octobre 2005 Dernière intervention - 24 oct. 2005 à 09:21
0
Utile
Ô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.