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

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


person Marco    schedule 24.11.2009    source источник


Ответы (5)


Это можно сделать, установив 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);
}
person Bob    schedule 24.11.2009

Каким бы старым ни был этот пост, я нашел его полезным в качестве отправной точки для поиска, но в итоге получил лучшие результаты, используя показанный метод здесь от @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();
            }

        }
person Dan    schedule 10.05.2012

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

Если, например, вы привязали ComboBox к DataTable и попытаетесь использовать код в ответе Дэна, вы просто получите 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).

person Martin Davies    schedule 04.04.2016

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

person RvdK    schedule 24.11.2009

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

person Fabian Vilers    schedule 24.11.2009