Search code examples
c#.netwinformscombobox

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?


Solution

  • 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;