更改ComboBox项的格式

时间:2009-11-24 13:53:07

标签: c# .net winforms combobox

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

5 个答案:

答案 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)

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