我知道wpf中的命令,但它在winform中的等价物是什么?
cboclient.IsHitTestVisible = false;
cboclient.Focusable = false;
使用此命令未禁用组合框,但用户无法打开它以读取数据。如何在winfrom中完成此操作?谢谢
详细信息:当表单最初加载时,我的表单上有3个组合框,只有第三个组合框无法打开读取数据。当用户在前两个组合框中选择值然后基于这两个值时,第三个组合框被启用以显示来自db的数据。
注意:这里我不想禁用第三个组合框。因为它会给用户提供错误的表达。
答案 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
}