using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.ComponentModel; using System.Drawing; using System.Windows.Forms.VisualStyles; namespace Developpez.Dotnet.Windows.Forms { /// /// Un ComboBox dont on peut personnaliser l'apparence de chaque élément /// séparément via un évènement /// public class ItemStyleComboBox : ComboBox { /// /// Initialise une nouvelle instance de ItemStyleComboBox /// public ItemStyleComboBox() { Initialize(); } /// /// Se produit avant qu'un élément ne soit dessiné, et permet de définir le style de cet élément /// public event ItemStyleEventHandler ItemStyle; /// /// Déclenche l'évènement ItemStyle /// /// Les paramètres de l'évènement protected virtual void OnItemStyle(ItemStyleEventArgs e) { if (ItemStyle != null) ItemStyle(this, e); } private void Initialize() { base.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; } /// /// Redéfinit ComboBox.OnDrawItem. Pour plus d'informations, voir cette méthode. /// /// Les paramètres de l'évènement protected override void OnDrawItem(DrawItemEventArgs e) { if (DesignMode) { base.OnDrawItem(e); return; } else { ItemStyleEventArgs eStyle = new ItemStyleEventArgs(this, e); OnItemStyle(eStyle); DrawItemEventArgs e2 = new DrawItemEventArgs( e.Graphics, eStyle.Font, e.Bounds, e.Index, e.State, eStyle.ForeColor, eStyle.BackColor ); try { CustomDrawItem(e2); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } private void CustomDrawItem(DrawItemEventArgs e) { using (Brush foreBrush = new SolidBrush(e.ForeColor)) { if (e.State.HasFlag(DrawItemState.ComboBoxEdit)) { e.DrawBackground(); } else if (!e.State.HasFlag(DrawItemState.Focus)) { e.DrawBackground(); } object item = null; if (e.Index >= 0) item = this.Items[e.Index]; string text = (item != null) ? this.GetItemText(item) : String.Empty; e.Graphics.DrawString(text, e.Font, foreBrush, e.Bounds); } } } }