返回首页

简介
很多人一样,我一直在寻找一个只读组合框。大多数可用的代码示例是复杂的,有一些故障,或只是不只读的,我们想要的那种。于是我就找一个简单的解决方案使用Windows消息保持下拉式封闭。正如您将在本文中看到的代码是很容易的。使用代码
从ComboBox继承一个类并重写的事件,可以修改它的价值。在事件中,你可以检查如果ComboBox为只读,以及块或忽略输入。

// =============================================

// Author: KC

// Create date: 03/05/07

// Description: ReadOonly ComboBox

// =============================================

    class RoComboBox : System.Windows.Forms.ComboBox

    {

        private bool readOnly;

        public bool ReadOnly

        {

            get { return readOnly;}

            set { readOnly = value;}

        }

        protected override void  

            OnKeyDown(System.Windows.Forms.KeyEventArgs e)

        {

            if (readOnly)

                e.Handled = true;

             base.OnKeyDown(e);

        }

        protected override void 

            OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)

        {

            if (readOnly)

                e.Handled = true;

            base.OnKeyPress(e);

        }

        protected override void WndProc(ref System.Windows.Forms.Message m)

        {

            // WM_LBUTTONDOWN && WM_LBUTTONDBLCLK

            if ((m.Msg != 0x201 && m.Msg != 0x203) || !readOnly)

                base.WndProc(ref m);

        }

    }
所以,这是什么代码做呢?
这是添加一个私有字段和一个只读的属性。{C}覆盖KeyDown和KeyPress;检查,如果属性readonly是真实的,并设置为已处理。然后,按键不会修改ComboBox的值。
        protected override void  

            OnKeyDown(System.Windows.Forms.KeyEventArgs e)

        {

            if (readOnly)

                e.Handled = true;

             base.OnKeyDown(e);

        }



        protected override void 

            OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)

        {

            if (readOnly)

                e.Handled = true;

            base.OnKeyPress(e);

        }

你必须做的最后一件事是块的鼠标,以防止从打开的下拉。您可以通过重写ComboBox中的WndProc和检查Windows消息的类型。座鼠标按钮,当地产的ReadOnly设置。
        protected override void WndProc(ref System.Windows.Forms.Message m)

        {

            // WM_LBUTTONDOWN && WM_LBUTTONDBLCLK

            if ((m.Msg != 0x201 && m.Msg != 0x203) || !readOnly)

                base.WndProc(ref m);

        }

兴趣点如果你想知道更多有关Windows消息,或为他们寻找一些恒定值,检查{A}历史
原始版本发布时间:2007年5月7日,日

回答

评论会员:PederA 时间:2011/12/14
!有用的代码
我有一个轻微sugestion,使向上/向下键:

受保护的覆盖子的OnKeyDown(#System.Windows.Forms.KeyEventArgs E)
如果_Readonly e.KeyCode LT,GT Keys.Up e.KeyCode LT,GT; Keys.Down然后
 0; e.Handled = TRUE
最终如果
MyBase.OnKeyDown(E)
END SUB
/ Peder
评论会员:seansos 时间:2011/12/14
VB翻译 - 主要是万一你错过了六角翻译
公共类ReadOnlyComboBox
继承ComboBox中

& #160; 私人m_ReadOnly布尔=假

  ; LT; System.ComponentModel.Category("行为"),System.ComponentModel.DefaultValue(FALSE)GT; -
  ; 公共财产]()[只读布尔
  ; 获取
  ; 返回m_ReadOnly
 0;最终获取
设置(BYVAL为布尔值)
m_ReadOnly =值

  ; 高端物业
  ; 受保护的覆盖子的OnKeyDown(#System.Windows.Forms.KeyEventArgs E)

如果m_ReadOnly然后
&# 160;e.Handled = TRUE
最终如果

MyBase.OnKeyDown(E)
END SUB

& #160; 保护覆盖子OnKeyPress(#System.Windows.Forms.KeyPressEventArgs E)

 60; 如果m_ReadOnly然后
 0; e.Handled = TRUE
&# 160; 最终如果

MyBase.OnKeyPress(E)
END SUB

& #160; 保护覆盖子的WndProc(为ByRef作为System.Windows.Forms.Message米)

如果(m.Msg LT,GT;放大器; H201 m.Msg LT,GT;放大器; H203)或者不m_ReadOnly

&# 160; MyBase.WndProc(M)

 0; 最终如果

 0;END SUB

尾类
评论会员:游客 时间:2011/12/14
Niiii​​ssssshhhhhuuuuu
没有源代码..

nishu
评论会员:topcatalpha 时间:2011/12/14
源代码提供了,但我会检查出错的地方... ...


评论会员:托尼贝穆德斯 时间:2011/12/14
源代码的链接被打破了。
评论会员:topcatalpha 时间:2011/12/14
现在的固定和源文件包含一个更新版本,包括只读复选框。我想使用的WndProc事件,也可以用于很多其他的事情和控制。

感谢

库尔特