using System;
using System.Drawing;
using System.Windows.Forms;
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()
{
DrawMode = 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;
}
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);
}
}
}
}