C# 更改组合框项目的格式

C# 更改组合框项目的格式,c#,.net,winforms,combobox,C#,.net,Winforms,Combobox,是否可以用C#设置组合框项目的格式?例如,如何使项目加粗、更改其文本的颜色等?是的,但要使用自定义图形创建自己的组合框 您可以通过将设置为OwnerDrawFixed来完成此操作,该选项允许您使用事件手动绘制项目 不,没有内置的属性来做这件事。您必须构建自己的控件并覆盖渲染。尽管这篇文章很古老,但我发现它作为搜索的起点很有用,但最终使用@Paul显示的方法得到了更好的结果 下面是我用来有条件地使组合框中的项目显示为粗体的代码,我发现这个问题的正确答案有一种奇怪的行为——当你将鼠标悬停在一个项目上

是否可以用C#设置组合框项目的格式?例如,如何使项目加粗、更改其文本的颜色等?

是的,但要使用自定义图形创建自己的组合框

您可以通过将设置为
OwnerDrawFixed
来完成此操作,该选项允许您使用事件手动绘制项目


不,没有内置的属性来做这件事。您必须构建自己的控件并覆盖渲染。

尽管这篇文章很古老,但我发现它作为搜索的起点很有用,但最终使用@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();
            }

        }

为了补充Dan提供的答案,请不要忘记,如果您已将列表绑定到数据源,而不仅仅是一个带有纯字符串的组合框,则无法使用
combo.Items[e.Index].ToString()重新绘制条目

例如,如果您将组合框绑定到一个DataTable,并尝试使用Dan答案中的代码,那么您将得到一个包含
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();
                }

            }
private void ComboBox1\u DrawItem(对象发送方,DrawItemEventArgs e)
{
如果(e.Index=-1)
返回;
组合框组合=((组合框)发送方);
使用(SolidBrush笔刷=新的SolidBrush(例如前景色))
{
Font=e.Font;
DataRowView项=(DataRowView)combo.Items[e.Index];
if(/*条件指定文本必须为粗体*/){
font=新系统.Drawing.font(字体,FontStyle.Bold);
}
否则{
font=新系统.Drawing.font(font,FontStyle.Regular);
}                    
e、 牵引杆接地();
e、 绘图字符串(item.Row.Field(“DisplayMember”)、字体、画笔、e.Bounds);
e、 DrawFocusRectangle();
}
}
其中
“DisplayMember”
是要在列表中显示的字段的名称(在
组合框1.DisplayMember
属性中设置)

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

            }