更改ComboBox项的格式

是否可以在C#中格式化ComboBox项? 例如,我如何使项目变粗,更改其文本的颜色等?

您可以通过将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所示的方法获得了更好的结果。

以下是我用来有条件地使combobox中的项目显示为粗体的代码,我发现对于这个问题标记正确的答案有奇怪的行为 – 当你将鼠标hover在一个项目上时会变得更大胆并保持这种方式就好像它正在重新绘制。 此代码使外观更自然:

 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(); } } 

只是为了添加Dan提供的答案,不要忘记,如果您已将列表绑定到数据源,而不是仅使用带有纯字符串的ComboBox,则无法使用combo.Items[e.Index].ToString()重绘条目。 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("DisplayMember"), font, brush, e.Bounds); e.DrawFocusRectangle(); } } 

其中"DisplayMember"是要在列表中显示的字段的名称(在ComboBox1.DisplayMember属性中设置)。

是的,但是使用自定义绘图创建自己的ComboBox 请参阅MSDN上的此处

不,没有内置属性可以做到这一点。 您必须构建自己的控件并覆盖渲染。