只读 ComboBox





3.00/5 (14投票s)
一个扩展的 ComboBox,为其添加了一个只读属性。
- 下载源代码 - 1.31 KB (更新于 2008年10月23日)
引言
我决定根据 MSDN Windows Forms 论坛用户的请求创建一个新的组合框。它为常规 ComboBox
添加了一个新的属性,使其可以设置为只读,就像常规 TextBox
一样。
使用代码
我使这段代码非常简单明了,你只需要下载 ZIP 文件中包含的 C# 文件,并将其添加到你的项目中即可。编译它,ExComboBox
应该可以在工具箱中使用。
你可以通过注释掉 ComboBoxRenderer
行并取消注释代码的注释部分来更改禁用按钮的外观。你可以通过更改 OnPaint
方法中 LinearGradientBrush
变量 lgb
的颜色来设置只读模式下按钮渐变的颜色。
protected class DblPanel : Panel
{
protected override void OnPaint(PaintEventArgs e)
{
if (this.Visible == true)
{
ComboBoxRenderer.DrawDropDownButton(e.Graphics, e.ClipRectangle,
System.Windows.Forms.VisualStyles.ComboBoxState.Disabled);
/*Pen pen = new Pen(Color.DarkGray);
Pen penBR = new Pen(Color.LightGray);
Pen penArrow = new Pen(Color.LightGray);
penArrow.Width = 2;
penArrow.EndCap = LineCap.Square;
Graphics g = e.Graphics;
LinearGradientBrush lgb = new LinearGradientBrush(new Point(0, 0),
new Point(0, this.Height + 1),
Color.LightGray, Color.Gray);
关注点
我在尝试将只读功能添加到常规 ComboBox
时学到了一些东西。有趣的是,组合框内部没有任何子控件(检查 ComboBox.Controls.Count
属性,你会发现它是 0);一切都是通过自定义绘制完成的。而且,我也了解到,通过重写其 Paint
方法无法更改这一点,因为它不会在那里发生;而且,我无法弄清楚它在哪里绘制自身,所以我使用一个 Panel 来覆盖常规下拉按钮。
因此,基本上,除了用户在不禁用控件的情况下无法更改所选项目之外,所有原始组合框的功能都得以保留(许多人抱怨将 Enabled
属性设置为 false
会使其难以阅读,并且不允许使用自定义颜色)。