当 DropdownStyle 为 DropDownList 时,如何更改 ComboBox 的背景颜色?

How to change the BackColor of a ComboBox when DropdownStyle is DropDownList?

DropdownStyle 属性 为 DropdownList 时,我正在尝试更改 ComboBox 的显示颜色。当 属性 从 DropdownList 更改为 Dropdown 时,颜色会发生变化。

如何控制下拉框的视图颜色?

谢谢

可以设置FlatStyle property to Popup。这样,背景颜色将在 DropDownDropDownList 模式下使用。

如果您不喜欢扁平化风格或者您需要对 ComboBox 的渲染进行更多自定义,您可以使用自画 ComboBox。例如,您可以设置 DrawMode property to OwnerDrawFixed and handle DrawItem 事件并根据您的逻辑绘制组合框。

您可能还对以下自定义 ComboBox 的帖子感兴趣:

就像上面提到的;您可以将 FlatStyle 属性 设置为 Popup/Flat。这样背景颜色将在 DropDown 和 DropDownList 模式下使用。

但这样一来,您将不会拥有预期的外观。 我有一个技巧,我创建一个面板并将其边框 属性 更改为 FixedSingle。根据需要更改面板的颜色,然后更改其大小 属性 以匹配您的 ComboBox 的大小。例如到 80、22。 在您拥有 ComboBox 的位置,放置您的面板。 将您的组合框放在面板上。 如果你能微调它的位置,调试的时候,你会发现你的ComboBox看起来像有边框。

几年来我一直在使用堆栈溢出,但没有订阅或贡献。这是我寻找解决方案时的首选,因为它通常会提供解决方案,而且我无需缩放即可阅读。 81 岁的我已经变成化石了,但“灭绝还是一种乐趣”。 谢谢,奥格登纳什。

当对文本应用背景阴影时,降低的对比度使我的老眼难以阅读。我用谷歌搜索了这个问题,所提供的解决方案把我吓跑了。 我什至考虑过使用图形来拼凑功能,但我需要几个实例。一定有办法。

用文本框覆盖组合框的文本部分,并将文本框更改为多行,使其高度与组合框匹配。添加几个事件处理程序,Bob 就是你的叔叔。

Private Sub cmbPoints_SelectedIndexChanged(sender As Object, e As EventArgs
                                     )HandlescmbPoints.SelectedIndexChanged
  ' Make the selection visible in the textbox
  txtPoints.Text = cmbPoints.Text
End Sub
Private Sub txtPoints_GotFocus(sender As Object, e As EventArgs
                              ) Handles txtPoints.GotFocus
  ' Prevent the user changing the text.
  cmbPoints.Focus()
End Sub

我创建了自己的用户控件。您必须将下拉菜单设置为 Flatstyle=Flat 并更改 Backcolor=White。然后下面的代码将绘制缺少的边框。下面是代码和它的外观图片。您可以将其复制并粘贴到您自己的命名空间中的某处,并根据您的喜好命名。

注意:您需要添加System.Windows.Forms; System.ComponentModel;并且 System.Drawing;到你的 Class.

using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

public class KDCombo : ComboBox
{

    public KDCombo()
    {
        BorderColor = Color.DimGray;
    }

    [Browsable(true)]
    [Category("Appearance")]
    [DefaultValue(typeof(Color), "DimGray")]
    public Color BorderColor { get; set; }

    private const int WM_PAINT = 0xF;
    private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_PAINT)
        {
            using (var g = Graphics.FromHwnd(Handle))
            {
                // Uncomment this if you don't want the "highlight border".
                /*
                using (var p = new Pen(this.BorderColor, 1))
                {
                    g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
                }*/
                using (var p = new Pen(this.BorderColor, 2))
                {
                    g.DrawRectangle(p, 0, 0, Width , Height );
                }
            }
        }
    }
}