Можно ли отформатировать элемент ComboBox в С#? Например, как сделать элемент полужирным, изменить цвет его текста и т. д.?
Изменение формата элемента ComboBox
Ответы (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);
}
Каким бы старым ни был этот пост, я нашел его полезным в качестве отправной точки для поиска, но в итоге получил лучшие результаты, используя показанный метод здесь от @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();
}
}
Просто чтобы добавить к ответу, предоставленному Дэном, не забывайте, что если вы привязали список к источнику данных, а не просто имели поле со списком с простыми строками, вы не сможете перерисовать запись с помощью 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
).
Да, но с созданием собственного ComboBox с пользовательским рисунком См. здесь, в MSDN
Нет, для этого нет встроенного свойства. Вам придется создать свой собственный элемент управления и переопределить рендеринг.