返回首页

(2008年10月23日更新)
{S0}简介
我决定创建一个新的ComboBox基于MSDN Windows窗体论坛用户的要求。它增加了一个新的属性,因此它可以设置为只读,就像经常文本框到正规的ComboBox。使用代码
我这个代码相当简单,因此,所有你所要做的是下载的C#文件在上面的ZIP文件内,并把它添加到您的项目。构建它,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中不有任何子控件(检查ComboBox.Controls.Count财产,你会看到它是0);所有自定义绘制完成。 ,我也了解到,有没有办法改变,通过重写其paint方法,因为它不会有发生;,我无法弄清楚它绘制自身,所以我用了一个小组来笼络定期下拉按钮。
因此,基本上,所有的功能是从原来的组合框保持除了为用户的能力,改变所选项目,而不禁用控制(许多人抱怨,将Enabled属性设置为false,难以阅读并没有允许使用自定义颜色)。

回答

评论会员:弗雷泽J 时间:2011/12/15
Gidday,我已经使用了一段时间现在,但当前的项目,我很多PC的工作没有视觉样式激活。我无法改变这一点。我添加下面的代码(下面的错误),但是我偶尔会得到这个错误:

异常:System.ArgumentException:参数无效BR} System.Drawing.Bitmap ..构造函数(Int32的宽度,高度的Int32,PixelFormat的格式)
System.Drawing.Bitmap ..构造函数(Int32的宽度,Int32的高度)
System.Windows.Forms.ControlPaint.DrawFrameControl(,INT32,INT32 x Graphics图形的Int32宽度,Int32的高度,Int32的一种,INT32状态,前景色颜色,颜色的BackColor)
System.Windows.Forms.ControlPaint.DrawComboButton(Graphics图形,INT32 x,INT32 Ÿ,Int32的宽度,Int32的高度,ButtonState状态)
System.Windows.Forms.ControlPaint.DrawComboButton(Graphics图形,矩形矩形,ButtonState状态)


保护类DblPanel
继承面板
  ; 保护重载覆盖分BYVAL e作为PaintEventArgs的OnPaint()
如果Me.Visible = True,则
如果ComboBoxRenderer.IsSupported然后
& #160; ComboBoxRenderer.DrawDropDownButton(e.Graphics,e.ClipRectangle,System.Windows.Forms.Vi​​sualStyles.ComboBoxState.Disabled)
&# 160; ELSE
如果Me.Enabled然后
& #160; ControlPaint.DrawComboButton(e.Graphics,e.ClipRectangle,ButtonState.Normal)
 0; ELSE
&# 160; ControlPaint.DrawComboButton(e.Graphics,e.ClipRectangle,ButtonState.Inactive)
最终如果
  ; 最终如果
 0; 最终如果
END SUB
尾类

任何想法就如何防止错误
评论会员:?法比奥佛朗哥 时间:2011/12/15
偶尔你说你的错误?什么样的情况触发呢?

我从您的代码可以看到的是,这部分是不必要的(除非你改变一些行为):

ELSE
如果Me.Enabled然后
ControlPaint.DrawComboButton(e.Graphics,e.ClipRectangle,ButtonState.Normal)
ELSE
ControlPaint.DrawComboButton(e.Graphics,e.ClipRectangle,ButtonState.Inactive)
最终如果

你只需要绘制如果可见= TRUE。如果不是,则需要没有平局,ButtonState.Normal是原有的控制本身已经绘制成的面板将不可见。

你想要的是检查的ComboBoxRender.IsSupported。如果是的话,使用的VisualStyles,如果它不使用ButtonSatate.Inactive。

ControlPaint的绘制方法是在任何情况下,造成的问题,我不知道可能是什么原因,因为我不熟悉其实施。为了解决这个问题,我建议您使用自定义绘图时禁用视觉样式,在文章中解释
我很抱歉,如果我不能帮助您进一步。的问候,
法比奥
评论会员:ger0nim0 时间:2011/12/15
究竟是什么,我一直在寻找。非常感谢你们
评论会员:。法比奥佛朗哥 时间:2011/12/15
我很高兴能帮助
感谢您的投票。

的问候,
法比奥
评论会员:会员1974570 时间:2011/12/15


您添加到您的ComboBox控制面板,什么茹试图在那里做?
茹:使用控制面板的"面具"的控制,以支持"只读"?纠正我,如果我错了。

TIA的

修改,2009年4月30日,日(星期四)7:51
评论会员:法比奥佛朗哥 时间:2011/12/15
。嗨,我插入了一个在继承的控制面板,所以将原来的下拉按钮上面板的大小,大到足以覆盖整个下拉按钮。然后,我画此面板上禁用的下拉按钮的样子。

我希望这个回答你的问题。
的问候,
法比奥
评论会员:会员1974570 时间:2011/12/15
感谢您的回复。法比奥

所以技巧是什么?"OnKeyPress"和"OnKeyDown"的方法

TIA
评论会员:法比奥佛朗哥 时间:2011/12/15
。太

但也有"OnKeyPress"和"OnKeyDown"事件不会处理。
例如鼠标滚轮。鼠标滚轮也改变选定的项目,这样一来处理它。我需要重写WndProc方法,捕获所有消息发送到控制,我检查它是否是一个滚轮的消息和处理它,如果它是
也有Tab和箭头键,我处理覆盖ProcessCmdKey方法。
的问候,
法比奥
评论会员:吉奥Bejarasco 时间:2011/12/15
尼斯文章法比奥。这种控制的人在WinForms数据演示和验证是非常细致的,我是有价值的。我真的想创造之前,这样的事情,但我无法让自己开始。我总是诉诸繁琐的ComboBox文本框交换技术
评论会员:。DotDue 时间:2011/12/15
哦,这种做法已alway苦恼我的东西激烈。我很高兴地看到,有人做了本文。

-
托马斯由于
"个人精神错乱,是罕见的东西 - 但在团体,政党,国家和时代,它是规则"
- 尼采
评论会员:法比奥佛朗哥 时间:2011/12/15
吉奥Bejarasco写道:不错的文章法比奥。这种控制的人在WinForms数据演示和验证是非常细致的,我是有价值的。我真的想创造之前,这样的事情,但我无法让自己开始。我总是诉诸繁琐的ComboBox文本框交换技术。

吉奥您好,我很高兴为你工作。我得非常细致的数据演示和验证,并,我的意思是,这只是没有问这家伙,它为我工作,以及

感谢您的反馈。
的问候,

法比奥
评论会员:DotDue 时间:2011/12/15
首先,我想说这是我在寻找一个只读的ComboBox,我接触过还来的最大和最简单的解决方案。

对你的赞誉。

我有增加(我觉得)改善的一些建议:

1。使背景灰色时只读,像一个TextBox。我为只读的setter添加一行:
{C}
2。更换所有在你DblPanel的这种涂料,代码:
  

protected override void OnPaint(PaintEventArgs e)

{

    if (this.Visible == true)

    {

        ComboBoxRenderer.DrawDropDownButton(e.Graphics, e.ClipRectangle,

            System.Windows.Forms.VisualStyles.ComboBoxState.Disabled);

    }

}
但这些只是建议。控制仍然是伟大的,我一定会在我的项目使用。 {S1}

-
托马斯由于
"个人精神错乱,是罕见的东西 - 但在团体,政党,国家和时代,它是规则"
- 尼采
评论会员:游客 时间:2011/12/15
法比奥佛朗哥:喜DotDue,我很高兴你发现它有用,我感谢您的反馈至于你的建议:DotDue写道:1。使背景灰色时只读,像一个TextBox。我为只读的setter添加一行:this.BackColor=(m_Unselectable)?SystemColors.Control:SystemColors.Window;其实我更喜欢不限制用户所设置​​的颜色,我把它给用户,这样他可以做他喜欢。它是为想这功能做手工时,他比其他的方式处理EnabledChanged事件周围的人更容易。我认为,这种做法也涉及回忆过去的背景色设置,因为它现在的方式,当用户从只读状态,他的背部颜色变化之前将丢失。DotDue写道:2。更换所有在你DblPanel的这种涂料,代码:保护覆盖无效的OnPaint(PaintEventArgs的E){(this.Visible==TRUE) {ComboBoxRenderer.DrawDropDownButton(e.Graphics,e.ClipRectangle, System.Windows.Forms.Vi​​sualStyles.ComboBoxState.Disabled);}}事实上,比我提供一个更好的方法,我将进行更改和更新的文章。我将离开旧油漆代码的注释,以防有人希望给下拉按钮不同的颜色。再次感谢您的反馈。的问候,法比奥
DotDue
评论会员:游客 时间:2011/12/15
法比奥佛朗哥说:其实我更喜欢不限制用户所设置​​的颜色,我把它给用户,这样他可以做他喜欢。它是为想这功能做手工时,他比其他的方式处理EnabledChanged事件周围的人更容易。我认为,这种做法也涉及回忆过去的背景色设置,因为它现在的方式,当用户从只读状态,他的背部颜色变化之前将丢失。哦,当然是真实的。味道当然是一个问题。我从来没有想过改变背景颜色。它都必须存储在某个地方,当然。-托马斯由于"个人精神错乱,是罕见的东西-但在团体,政党,国家和时代,它是规则"-尼采
josephlawrencecarpio
评论会员:游客 时间:2011/12/15
你不明白这一点,但在现实中,这有助于我们的球员,一个ComboBox的属性设置启用难以阅读。与此,文章,它是由你如何处理只读组合框。简单,因为它是....imgsrc=http://www.orcode.com/upimg/2011_12_15_18_24_59_2.gif你得5darkmaster35
法比奥佛朗哥
评论会员:游客 时间:2011/12/15
谢谢约瑟夫,它始终是很好听,我可以帮助的人。我这样做,因为我从几个开发商听说过这个残疾组合框的阅读问题。再次感谢您的反馈。的问候,法比奥
法比奥佛朗哥
评论会员:游客 时间:2011/12/15
但是你上面的截图,控制显示一个灰色的背景色设置为ReadOnly。如果我尝试使用您的控制,背景色为白色...?!?!?{BR}加-即使你不能选择一个新项目从下拉,你仍然可以突出显示文本,并删除​​它或改变它的风格,如果是下拉。所以看来,这不是真正的只读...imgsrc=http://www.orcode.com/upimg/2011_12_15_18_24_59_2.gif欢呼声,约翰尼J.
法比奥佛朗哥
评论会员:游客 时间:2011/12/15
嗨,在这种情况下的灰色背景色,它是因为它被选中,这是在我的测试应用程序的配置选择颜色。关于能够突出和删除文本,我会检查它在这里。反馈。的问候,法比奥
dfjohn005
评论会员:游客 时间:2011/12/15
好,我想我让unoticed传递。但现在你无法编辑文本时的ReadOnly设置为true。页面顶部的链接。的问候,法比奥
法比奥佛朗哥
评论会员:游客 时间:2011/12/15
为什么不只是使用DropDownStyle属性,DropDownList的值??
托马斯斯托克韦尔
评论会员:游客 时间:2011/12/15
使用dropdownstyle作为DropDownList的不会阻止用户改变ComboBox中选定的指数。也许你误解了ComboBox的ReadOnly的概念。
法比奥佛朗哥
评论会员:游客 时间:2011/12/15
你可以将Enabled属性设置为false。的问候,托马斯斯托克韦尔编程,今天是一个软件工程师努力建立更大,更好的白痴型的方案,以及宇宙产生更大,更好的白痴之间的比赛。到目前为止,宇宙是获胜。访问我的主页imgsrc=http://www.orcode.com/upimg/2011_12_15_18_24_59_1.gif