65.9K
CodeProject 正在变化。 阅读更多。
Home

只读 ComboBox

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (14投票s)

2007年12月26日

CPOL

1分钟阅读

viewsIcon

93875

downloadIcon

1410

一个扩展的 ComboBox,为其添加了一个只读属性。

Sample.JPG

引言

我决定根据 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 会使其难以阅读,并且不允许使用自定义颜色)。

© . All rights reserved.