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 :
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
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'utilise l'évènement DrawItem du Combo (propriété "DrawMode" sur "OwnerDrawFixed").
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"; }
Je lis les tags pour changer la couleur de l'item :
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
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); }
Puis
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);
Merci pour vos commentaires éventuels
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
Partager