Изменение формата элемента ComboBox

Можно ли форматировать элемент ComboBox на С#? Например, как мне сделать элемент полужирным, изменить цвет его текста и т.д.?

Ответ 1

Вы можете сделать это, установив DrawMode на OwnerDrawFixed, который позволяет вручную рисовать элементы с помощью DrawItem.

comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem);

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) {    
    Font font = comboBox1.Font;
    Brush brush = Brushes.Black;
    string text = comboBox1.Items[e.Index]; 

    if (you want bold)
        font = new Font(font, FontStyle.Bold);

    if (you want green)
        brush = Brushes.Green;

    e.Graphics.DrawString(text, font, brush, e.Bounds);
}

Ответ 2

Как и старый пост, я нашел его полезным в качестве отправной точки для поиска, но в итоге получил лучшие результаты, используя метод, показанный здесь by @Paul.

Вот код, который я использовал для условного создания элементов в поле со списком, выделен жирным шрифтом, я считаю, что ответ, помеченный как правильный для этого вопроса, имеет странное поведение - когда вы наводите курсор на элемент, он становится немного более смелым и остается таким же, как если бы он перерисовывается. Этот код дает более естественный вид:

private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (e.Index == -1)
                return;
            ComboBox combo = ((ComboBox)sender);
            using (SolidBrush brush = new SolidBrush(e.ForeColor))
            {
                Font font = e.Font;
                if (/*Condition Specifying That Text Must Be Bold*/)
                    font = new System.Drawing.Font(font, FontStyle.Bold);
                e.DrawBackground();
                e.Graphics.DrawString(combo.Items[e.Index].ToString(), font, brush, e.Bounds);
                e.DrawFocusRectangle();
            }

        }

Ответ 3

Чтобы добавить к ответу, предоставленному Дэном, не забывайте, что если вы привязали список к источнику данных, а не просто с ComboBox с простыми строками, вы не сможете перерисовать запись, используя combo.Items[e.Index].ToString().

Если, например, вы привязали ComboBox к DataTable и попытаетесь использовать код в ответе Dan, вы просто получите ComboBox, содержащий System.Data.DataRowView, поскольку каждый элемент в списке не является строка, это DataRowView.

В этом случае код будет выглядеть примерно так:

 private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e)
            {
                if (e.Index == -1)
                    return;
                ComboBox combo = ((ComboBox)sender);

                using (SolidBrush brush = new SolidBrush(e.ForeColor))
                {
                    Font font = e.Font;
                    DataRowView item = (DataRowView)combo.Items[e.Index];

                    if (/*Condition Specifying That Text Must Be Bold*/) {
                        font = new System.Drawing.Font(font, FontStyle.Bold);
                    }
                    else {
                        font = new System.Drawing.Font(font, FontStyle.Regular);
                    }                    

                    e.DrawBackground();
                    e.Graphics.DrawString(item.Row.Field<String>("DisplayMember"), font, brush, e.Bounds);
                    e.DrawFocusRectangle();
                }

            }

Где "DisplayMember" - имя поля, которое будет отображаться в списке (установлено в свойстве ComboBox1.DisplayMember).

Ответ 4

Да, но с созданием собственного ComboBox с пользовательским рисунком См. здесь в MSDN

Ответ 5

Нет, для этого нет встроенного свойства. Вам придется создать собственный контроль и переопределить рендеринг.