禁用文本选择并编辑ComboBox

时间:2018-07-05 15:25:57

标签: c# winforms combobox

如何防止使用ComboBox(不是ComboBoxStyle.DropDown!)设置对DropDownList进行任何编辑和选择尝试? 我覆盖OnKeyDown并剪切了所有键盘输入,但是鼠标选择事件仍然有效,并且插入符号可见。

1 个答案:

答案 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);
}