Bonjour,

Je partage une solution qui fonctionne bien pour moi.

Dans un formulaire, j'ai un Combo qui permet de choisir des opérations financières.
Les opérations sont ensuite présentées dans une ListView avec leurs informations.

Je souhaite que les opérations déjà réalisées ne puissent pas être saisies deux fois.
Et donc présenter aussi dans la liste du Combo, en texte de couleur différente, les opérations déjà réalisées.

Quand je charge la liste du Combo, j'ajoute un tag par défaut (in) à chaque item :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
            string[] ListOP;
            ListOP = new string[] { "Achat", "Vente", "Livraison", "Enlèvement", "Recette livraison", "Remboursement", "Virement", "Apport", "Frais de transaction" };
            string ItemTag;
 
            OpCombo.Items.Clear();
 
 
                foreach (string op in ListOP)
                {
                    var newItem = new ComboboxItem();
                    newItem.Content = op;
                    ItemTag = "in";
                    newItem.Tag = ItemTag;
                    OpCombo.Items.Add(newItem);
                }
J'interroge le Dataset pour savoir quelles opérations sont déjà saisies en comptabilité, et je modifie le tag (out) de l'élément correspondant.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
                DataRow[] foundRows;
                foundRows = ComptaDataSet.Tables["Compta"].Select("Ref = " + CleRef);
 
                int Index;
                foreach (DataRow dr in foundRows) 
                {
                    string LibelleBdD = dr["Libelle"].ToString();
 
                        Index = OpCombo.FindStringExact(LibelleBdD);
                        ((MonApp.MonAppForm.ComboboxItem)OpCombo.Items[Index]).Tag = "out";
 
                }
J'utilise l'évènement DrawItem du Combo (propriété "DrawMode" sur "OwnerDrawFixed").
Je lis les tags pour changer la couleur de l'item :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
        private void OpCombo_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (e.Index < 0) return;
            var NomComboItems = (sender as ComboBox).Items;
 
            var ItemTag = ((MonApp.MonAppForm.ComboboxItem)NomComboItems[e.Index]).Tag;
 
            // get the item text    
            string text = ((ComboBox)sender).Items[e.Index].ToString();
 
            // determine the forecolor based on the item tag value    
            Brush brush;
            if ((string)ItemTag == "out") 
            {
                    brush = Brushes.DarkGray;
            }
            else
            {
                brush = Brushes.Black;
            }
 
            // draw the text    
            e.Graphics.DrawString(text, ((Control)sender).Font, brush, e.Bounds.X, e.Bounds.Y);
        }
Noter que je peux utiliser un tableau de string pour le tag, et ainsi disposer de plus de choix de couleur de texte.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 string[] ItemTag;
 
                var newItem = new ComboboxItem();
                newItem.Content = dwR["Nom"].ToString();
                ItemTag = new string[3] { "toto", "titi", "tutu" };
                newItem.Tag = ItemTag;
                OpCombo.Items.Add(newItem);
Puis

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
                var ItemTag = ((MonApp.MonAppForm.ComboboxItem)OpCombo.Items[OpCombo.SelectedIndex]).Tag;
 
                If(((string[])ItemTag)[0] == toto.Text) ... etc
                If(((string[])ItemTag)[1] == titi.Text) ... etc
Merci pour vos commentaires éventuels