Show list of colors in ComboBox - Color Picker

I'd like to fill my ComboBox with a list of all colors. I was expecting Something like:

CBcolor.DataSource = AllColor;

Then I'd like to use my ComboBox like this:

Color selected = CBcolor.selectedvalue;   
C_ObjetGraphique cercle = new dessin.Cercle(e.Location, selected, selected, 100);
cercle.Affiche();
ledessin.ajoute(cercle);

How can I Show list of colors in my ComboBox as a color picker?

Upvotes: 5

Views: 6702

Answers (1)

Reza Aghaei
Reza Aghaei

Reputation: 125197

In general you need to set the list of colors as data source of combo box. You may have a list of some predefined colors like Color.Red, Color.Green, Color.Blue; You may rely on KnownColor, or you may use reflection to get Color properties of Color type.

In this example I use color properties of the Color type to show a combo box like this:

Show List of Colors in ComboBox

Get list of colors and set data source of combo box:

comboBox1.DataSource = typeof(Color).GetProperties()
    .Where(x => x.PropertyType == typeof(Color))
    .Select(x => x.GetValue(null)).ToList();

Handle custom draw of the combo box:

comboBox1.MaxDropDownItems = 10;
comboBox1.IntegralHeight = false;
comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox1.DrawItem += comboBox1_DrawItem;

Then for comboBox1_DrawItem:

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    if (e.Index >= 0)
    {
        var txt = comboBox1.GetItemText(comboBox1.Items[e.Index]);
        var color = (Color)comboBox1.Items[e.Index];
        var r1 = new Rectangle(e.Bounds.Left + 1, e.Bounds.Top + 1,
            2 * (e.Bounds.Height - 2), e.Bounds.Height - 2);
        var r2 = Rectangle.FromLTRB(r1.Right + 2, e.Bounds.Top,
            e.Bounds.Right, e.Bounds.Bottom);
        using (var b = new SolidBrush(color))
            e.Graphics.FillRectangle(b, r1);
        e.Graphics.DrawRectangle(Pens.Black, r1);
        TextRenderer.DrawText(e.Graphics, txt, comboBox1.Font, r2,
            comboBox1.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
    }
}

Get the selected color from combo box:

if(comboBox1.SelectedIndex>=0)
    this.BackColor = (Color)comboBox1.SelectedValue;

Upvotes: 11

Related Questions