是否可以在C#中格式化ComboBox项?例如,如何使项目变粗,更改其文本的颜色等?
答案 0 :(得分:11)
与这篇文章一样古老,我发现它可以作为搜索的起点,但最终使用@Paul显示的here方法获得了更好的结果。
以下是我用来有条件地使组合框中的项目显示为粗体的代码,我发现对于这个问题标记正确的答案有奇怪的行为 - 当您将鼠标悬停在某个项目上时会变得更大胆并保持这种状态,就好像它正在被重新绘制。此代码使外观更自然:
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();
}
}
答案 1 :(得分:8)
您可以将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 :(得分:2)
只是为了添加Dan提供的答案,不要忘记,如果您已将列表绑定到数据源,而不是只使用带有简单字符串的ComboBox,那么您将无法重绘使用combo.Items[e.Index].ToString()
进行输入。
例如,如果您已将ComboBox绑定到DataTable,并尝试使用Dan的答案中的代码,那么您最终会得到一个包含System.Data.DataRowView
的ComboBox ,因为列表中的每个项目都不是字符串,所以它是一个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
属性中设置)。
答案 3 :(得分:0)
是的,但是使用自定义绘图创建自己的ComboBox See here on MSDN
答案 4 :(得分:0)
不,没有内置属性可以做到这一点。您必须构建自己的控件并覆盖渲染。