Я могу предложить вам два (простых) метода для установки текста ComboBox только для чтения.
Использование SendMessage :
В этом случае ComboBox
лежащий в основе Edit
элемент управления установлен на ReadOnly, и, как уже было сказано, его цвет фона окрашен неактивным / отключенным цветом (LTGRAY_BRUSH).
Так же, как если бы вы установили для свойства TextBox
control 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
переменной класса и получить дескриптор управления Edit один раз в событии Form
Load.
[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);
}