如何防止使用ComboBox
(不是ComboBoxStyle.DropDown
!)设置对DropDownList
进行任何编辑和选择尝试?
我覆盖OnKeyDown
并剪切了所有键盘输入,但是鼠标选择事件仍然有效,并且插入符号可见。
答案 0 :(得分:0)
我可以建议您两个(简单的)方法来将ComboBox文本设置为只读。
使用SendMessage :
在这种情况下,将ComboBox
底层的Edit
控件设置为ReadOnly,并且-如前所述-其背景颜色涂有非活动/禁用的颜色(LTGRAY_BRUSH)。
就像您将TextBox
控件ReadOnly
属性设置为true一样。
[DllImport("User32.dll")]
internal static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll", SetLastError = true)]
internal static extern int SendMessage(IntPtr hWnd, uint uMsg, int wParam, int lParam);
private const uint EM_SETREADONLY = 0x00CF;
private void Form1_Load(object sender, EventArgs e)
{
IntPtr EditHandle = FindWindowEx(comboBox1.Handle, IntPtr.Zero, "Edit", null);
SendMessage(EditHandle, EM_SETREADONLY, 1, 0);
}
使用Control KeyDown
事件放弃任何按键操作:
在这种情况下,ComboBox
背景颜色当然不会改变,但是根据用途,可能会有不希望的行为。
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
}
更新:
隐藏插入号的方法(不带子类或继承):
在这里,我再次使用FindWindowEx
。您可以将IntPtr EditHandle
分配给类范围变量,并在Form
Load事件中获得一次Edit控件句柄。
[DllImport("user32")]
internal static extern bool HideCaret(IntPtr hWnd);
[DllImport("user32")]
internal static extern bool ShowCaret(IntPtr hWnd);
private void comboBox1_MouseUp(object sender, MouseEventArgs e)
{
comboBox1.Select(0, 0);
IntPtr EditHandle = FindWindowEx(comboBox1.Handle, IntPtr.Zero, "Edit", null);
HideCaret(EditHandle);
}