如何在winform中禁用combobox的读取操作?

时间:2013-11-27 05:13:37

标签: c# wpf winforms combobox

我知道wpf中的命令,但它在winform中的等价物是什么?

        cboclient.IsHitTestVisible = false;
        cboclient.Focusable = false;

使用此命令未禁用组合框,但用户无法打开它以读取数据。如何在winfrom中完成此操作?谢谢

详细信息:当表单最初加载时,我的表单上有3个组合框,只有第三个组合框无法打开读取数据。当用户在前两个组合框中选择值然后基于这两个值时,第三个组合框被启用以显示来自db的数据。

注意:这里我不想禁用第三个组合框。因为它会给用户提供错误的表达。

3 个答案:

答案 0 :(得分:1)

您可以捕获消息WM_MOUSEACTIVATE并将其丢弃以防止用户通过鼠标聚焦组合框并防止测试。捕获消息WM_SETFOCUS以防止用户通过键盘聚焦组合框。试试这段代码:

public class ComboBoxEx : ComboBox
{    
    public ComboBoxEx(){
        IsHitTestVisible = true;
    }
    public bool IsHitTestVisible { get; set; }
    public bool ReadOnly { get; set; }
    protected override void WndProc(ref Message m)
    {            
        if (!IsHitTestVisible)
        {
            if (m.Msg == 0x21)//WM_MOUSEACTIVATE = 0x21
            {
                m.Result = (IntPtr)4;//no activation and discard mouse message
                return;
            }
            //WM_MOUSEMOVE = 0x200, WM_LBUTTONUP = 0x202
            if (m.Msg == 0x200 || m.Msg == 0x202) return;
        }
        //WM_SETFOCUS = 0x7
        if (ReadOnly && m.Msg == 0x7) return;
        base.WndProc(ref m);
    }
    //Discard key messages
    public override bool PreProcessMessage(ref Message msg)
    {
        if (ReadOnly) return true;
        return base.PreProcessMessage(ref msg);
    }
}
//Usage
comboBoxEx1.ReadOnly = true;
comboBoxEx1.IsHitTestVisible = false;

答案 1 :(得分:0)

您可以使用以下代码:

cboclient.DropDownStyle = ComboBoxStyle.DropDownList;
cboclient.DropDownHeight = 1;
cboclient.DropDownWidth = 1;
cboclient.TabStop = false;

用于显示组合框作为您可以使用的只读组:

cboclient.FlatStyle = FlatStyle.Popup;

cboclient.FlatStyle = FlatStyle.Flat;

答案 2 :(得分:0)

您可以在OnSelectionChangedSelectionChanged事件中使用 if 语句。

  private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
      //here your if statement
    }