wpf 如何在WinForms中禁用组合框的读取操作?

f4t66c6m  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(163)

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

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

使用这个命令组合框没有被禁用,但是用户不能打开它来阅读数据。我怎样才能在WinForms中完成这个操作?谢谢
详细信息:我有3个组合框在我的表单上,当表单最初加载时,只有第三个组合框无法打开阅读数据。当用户在前两个组合框中选择一个值,然后基于这两个值,第三个组合框被启用以显示来自DB的数据。
注意:这里我不想禁用第三个组合框,因为它会给予用户一个错误的表达式。

g0czyy6m

g0czyy6m1#

您可以捕获消息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;
oxf4rvwz

oxf4rvwz2#

可以对OnSelectionChangedSelectionChanged事件使用if语句。

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

bqujaahr3#

您可以使用以下代码:

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

要将组合框显示为只读组合框,可以用途:

cboclient.FlatStyle = FlatStyle.Popup;

cboclient.FlatStyle = FlatStyle.Flat;

相关问题