Changer le couleur d'un item dans une listbox

Résolu
Maglitee Messages postés 9 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 5 décembre 2004 - 10 oct. 2004 à 17:36
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.

12 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
12 oct. 2004 à 12:02
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#
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 oct. 2004 à 18:47
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#
1
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
10 oct. 2004 à 20:33
DateTime.Now.ToString("dd'/'MM'/'yyyy")


Merci coq, je connaissais pas !

Mx
0
Maglitee Messages postés 9 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 5 décembre 2004
11 oct. 2004 à 12:37
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 ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 oct. 2004 à 13:25
euh, j'ai du mal a saisir ce que tu entend par interagir

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Maglitee Messages postés 9 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 5 décembre 2004
11 oct. 2004 à 17:21
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.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
11 oct. 2004 à 17:34
ah donc tu voudrais associer une couleur a chaque item ?

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

Maglitee
0
cs_titounne Messages postés 2 Date d'inscription jeudi 20 octobre 2005 Statut Membre Dernière intervention 24 octobre 2005
20 oct. 2005 à 15:43
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?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 oct. 2005 à 12:46
As tu fait ceci ? :
"donner à la propriété DrawMode du ListBox la valeur OwnerDrawVariable"

/*
coq
MVP Visual C#
*/
0
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
Ôupssss...... non j'ai mis l'autre valeur.... ma souris a dut riper.

Merci beaucoup
0
Rejoignez-nous