Отключить выделение текста и редактировать для ComboBox - PullRequest
0 голосов
/ 05 июля 2018

Как предотвратить любые попытки редактирования и выбора для ComboBox с настройкой ComboBoxStyle.DropDown (не DropDownList!)? Я переопределяю OnKeyDown и обрезаю любой ввод с клавиатуры, но события выбора мыши все еще работают, и курсор виден.

1 Ответ

0 голосов
/ 06 июля 2018

Я могу предложить вам два (простых) метода для установки текста 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...