我想要一个不可编辑的ComboBox但仍然显示白色背景颜色,因此它的效果有点像默认的ComboBox样式(DropDown)。 ComboBoxStyle.DropDownList仅提供标准"禁用"看起来灰色背颜色。只需设置BackColor = Color.White就没有效果了。
答案 0 :(得分:2)
使ComboBox DropDownList看起来像ComboBox DropDown:
答案 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 ================= =============
此方法只是钩住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)