Combobox DropDownList样式有白色背景

时间:2016-07-30 22:40:38

标签: c# combobox

我想要一个不可编辑的ComboBox但仍然显示白色背景颜色,因此它的效果有点像默认的ComboBox样式(DropDown)。 ComboBoxStyle.DropDownList仅提供标准"禁用"看起来灰色背颜色。只需设置BackColor = Color.White就没有效果了。

DropDownList:DropDownList

DropDown:DropDown

6 个答案:

答案 0 :(得分:2)

使ComboBox DropDownList看起来像ComboBox DropDown:

  1. 将一个ComboBox添加到WinForm。转到属性资源管理器。选择DropDownStyle>下拉列表。然后选择FlatStyle>平。
  2. 将面板添加到WinForm。转到属性资源管理器。选择BorderStyle> FixedSingle。
  3. 将ComboBox拖到Panel上。激活ComboBox后,转到属性资源管理器> Dock>继续进行。
  4. 在ComboBox处于活动状态时,按住“Shift”键,选择面板使其处于活动状态(选择顺序很重要)。
  5. 转到布局工具栏(查看>工具栏>布局),然后选择“制作相同尺寸”。
  6. 运行程序时,DropDownList ComboBox应该看起来像DropDown ComboBox

答案 1 :(得分:1)

要实现具有白色背景的DropDownList组合框,请创建一个简单的包装器类:

  public class ComboBoxClean : ComboBox
    {
        public ComboBoxClean()
        {
            DropDownStyle = ComboBoxStyle.DropDownList;
            DrawMode = DrawMode.OwnerDrawFixed;
        }

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            Color textColor = e.ForeColor;

            if ((e.State & DrawItemState.Focus) != DrawItemState.Focus)
                e.DrawBackground();
            else
                textColor = Color.Black;

            e.DrawFocusRectangle();

            var index = e.Index;
            if (index < 0 || index >= Items.Count) return;
            var item = Items[index];

            string text = (item == null) ? "(null)" : item.ToString();
            using (var brush = new SolidBrush(textColor))
            {
                e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
                e.Graphics.DrawString(text, e.Font, brush, e.Bounds);
            }
        }
    }

答案 2 :(得分:1)

我碰到了这篇文章,寻求解决这个问题的方法,但是找不到我真正需要的解决方案。我做了一些实验,并提出了针对Visual Basic .NET的解决方案,该解决方案是本文中亚当的代码和其他here的融合。

我将展示两种不同的实现方式,并简要讨论赞成和反对的:

  1. 挂钩DrawItem事件;
  2. 创建自定义控件。

===========================方法1 ================= =============

此方法只是钩住ComboBox的DrawItem事件,因此不需要自定义控件。

STEP 1

照常添加您的ComboBox。在其属性中,将 DrawMode 更改为OwnerDrawFixed。如果您忘记了这一点,那么下一部分将什么也不做。当然,也可以将 DropDownStyle 更改为DropDownList

STEP 2

添加自定义处理程序:

Private Sub ComboBox1_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem
    Dim cmb = CType(sender, ComboBox)
    If cmb Is Nothing Then Return

    Dim index As Integer = If(e.Index >= 0, e.Index, -1)
    Dim brush As Brush = If(((e.State And DrawItemState.Selected) > 0), SystemBrushes.HighlightText, New SolidBrush(cmb.ForeColor))
    e.DrawBackground()

    If index <> -1 Then
        e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit
        e.Graphics.DrawString(cmb.Items(index).ToString(), e.Font, brush, e.Bounds, StringFormat.GenericDefault)
    End If

    e.DrawFocusRectangle()
End Sub

注意

您可以使用单个子项来处理多个ComboBox,但是必须记住要手动将它们添加到Handles

============================方法2 ================== =============

此方法依赖于从ComboBox继承的自定义控件。通过将此自定义控件添加到我们的表单中,而不是普通的ComboBox,它就可以工作-我们不必担心Handles语句。如果您打算拥有多个ComboBox,则可能是这样。

STEP 1

通过右键单击您的项目,“添加”,“新建项目”,然后选择自定义控件(Windows窗体),添加自定义控件。我将其命名为 ComboBoxClean

STEP 2

在文件ComboBoxClean.vb中,将自动生成的代码替换为:

Public Class ComboBoxClean
    Inherits ComboBox

    Public Sub New()
        DropDownStyle = ComboBoxStyle.DropDownList
        DrawMode = DrawMode.OwnerDrawFixed
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
    End Sub

    Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)
        Dim index As Integer = If(e.Index >= 0, e.Index, -1)
        Dim brush As Brush = If(((e.State And DrawItemState.Selected) > 0), SystemBrushes.HighlightText, New SolidBrush(ForeColor))
        e.DrawBackground()

        If index <> -1 Then
            e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit
            e.Graphics.DrawString(Items(index).ToString(), e.Font, brush, e.Bounds, StringFormat.GenericDefault)
        End If

        e.DrawFocusRectangle()
    End Sub
End Class

第3步

在解决方案资源管理器中,单击“显示所有文件”。打开 ComboBoxClean.Designer.vb

用以下内容替换现有的 Inherits 语句:

Inherits ComboBox

注释

  • 您应该先进行构建,然后再尝试使用它,以确保一切正常。
  • 在工具箱中,您的自定义控件将出现在常规控件列表中。您当前的解决方案应该在其自己的“组件”部分中找到新控件。只需将其拖到您的表单上,然后像普通的组合框一样使用它即可。
  • New负责为我们自动进行重要的属性更改,否则,每次添加新的ComboBox时,我们都必须手动进行更改。

答案 3 :(得分:0)

您必须使用custom drawing创建自己的ComboBox或使用第三方控件,例如Infragistics UltraCombo

public class MyComboBox : ComboBox
    {
        public MyComboBox()
        {
            this.SetStyle(ControlStyles.UserPaint, true);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
          // Repaint here
        }
    }

答案 4 :(得分:0)

在努力让控件看起来与DropDown ComboBox样式相同时,我不得不解决覆盖OnKeyPress事件的问题,这样就限制了用户无法编辑控件。作为旁注,我还建议覆盖适当的事件,以防止用户将值粘贴到ComboBox(how to disable copy, Paste and delete features on a textbox using C#)。

FILESTREAM

答案 5 :(得分:0)

我玩了一段时间,并没有想做任何太多的事情。上面的那些想法可能有用,但我所做的只是改变了#34;标准&#34; to&#34; flat&#34;。

虽然不完美,但它至少会将灰色/禁用的背景更改为白色。

你可以在这里看到比较:

加热源#1&gt; DropdownList&gt; flat(自下拉列表以来最终决定允许用户输入错误数据)

加热器源#2&gt;下拉>标准(默认看起来不错)

房屋类型&gt;下拉>平

加热源#1供应商&gt; DropdownList&gt;标准(默认情况下看起来已禁用灰色enter image description here