using System; using System.Drawing; using System.Windows.Forms; namespace Developpez.Dotnet.Windows.Forms { /// /// Une ListBox dont on peut personnaliser l'apparence de chaque élément /// séparément via un évènement /// public class ItemStyleListBox : ListBox { /// /// Initialise une nouvelle instance de ItemStyleListBox /// public ItemStyleListBox() { 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() { DrawMode = DrawMode.OwnerDrawFixed; } /// /// Redéfinit ListBox.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; } object value = (e.Index >= 0) ? Items[e.Index] : null; ItemStyleEventArgs eStyle = new ItemStyleEventArgs(e, value); 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 = Items[e.Index]; string text = (item != null) ? GetItemText(item) : String.Empty; e.Graphics.DrawString(text, e.Font, foreBrush, e.Bounds); } } } }