Можно ли форматировать элемент 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
Нет, для этого нет встроенного свойства. Вам придется создать собственный контроль и переопределить рендеринг.