只读的组合框
介绍 和很多人一样,
我也在寻找只读组合盒。大多数可用的代码示例都是复杂的,有一些错误,或者不是我们想要的那种只读的。所以我去寻找一个简单的解决方案,使用Windows消息保持下拉菜单关闭。正如您将在本文中看到的,代码非常简单。 使用的代码 从组合框继承类并覆盖可以修改类值的事件。在events下,您可以检查combobox是否为只读,以及块或忽略输入。 隐藏,收缩,复制Code
// ============================================= // 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); } }
那么,这段代码是干什么的呢? 它添加了一个私有字段和一个名为ReadOnly的属性。 隐藏,复制Code
private bool readOnly; public bool ReadOnly { get { return readOnly;} set { readOnly = value;} }
覆盖按键和按键;检查属性ReadOnly是否为真并设置为已处理。然后按键将不会修改组合框的值。 隐藏,复制Code
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时,阻塞鼠标按钮。 隐藏,复制Code
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消息的信息,或者为它们寻找一些常量值,请访问http://www.pinvoke.net/default.aspx/Constants.WM 历史 原始版本发布于:2007年5月7日 本文转载于:http://www.diyabc.com/frontweb/news349.html