简介
很多人一样,我一直在寻找一个只读组合框。大多数可用的代码示例是复杂的,有一些故障,或只是不只读的,我们想要的那种。于是我就找一个简单的解决方案使用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的值。
你必须做的最后一件事是块的鼠标,以防止从打开的下拉。您可以通过重写ComboBox中的WndProc和检查Windows消息的类型。座鼠标按钮,当地产的ReadOnly设置。 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);
}
兴趣点如果你想知道更多有关Windows消息,或为他们寻找一些恒定值,检查{A}历史 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);
}
原始版本发布时间:2007年5月7日,日