Поместите символ лигатуры в текст ComboBox

Я использую ComboBox с DropDownStyle установленным на DropDown, что означает, что я могу вставить любой текст, независимо от источника данных списка ComboBox.

Я установил DataSource на:

comboBox.DataSource = new List<string> {"", "oe"};

Если я устанавливаю текст с лигатурой:

comboBox.Text = "œ";

он немедленно изменяется на форму oe.

Текст обычно устанавливается, когда запись нормализации лигатуры не существует в источнике данных.

Как заставить не нормализовать этот текст?


person gangus    schedule 06.06.2019    source источник
comment
Могу подтвердить это. Добавление поля со списком и кнопки, а затем нажатие кнопки для установки текста, как вы, сначала покажет oe, а второй щелчок покажет œ, не знаю почему. Каким-то образом "œ" == "oe", когда выпадающий список сравнивает их и выбирает последний из источника данных.   -  person Sinatr    schedule 06.06.2019
comment
@Sweeper, ты можешь сказать здесь? Я обнаружил, что "oe".Equals("œ", StringComparison.InvariantCulture) возвращает true.   -  person Sinatr    schedule 06.06.2019


Ответы (1)


Вы можете использовать свойство SelectedText. вместо свойства Text:

comboBox.Focus();
comboBox.SelectedText = "œ";

Установка значения SelectedText подразумевает отправку (SendMessage) сообщения EM_REPLACESEL элементу управления Edit ComboBox. Это просто заменяет текст в элементе управления Edit: элемент управления не пытается сопоставить введенный текст с элементами в списке.

Вы также можете сбросить свойство Text, установив:

comboBox.Text = string.Empty;
comboBox.SelectedText = "œ";

В этом случае установка свойства ComboBox.Text вызывает событие TextChanged 3 раза, когда есть предыдущий выбор, а установка фокуса (выбор выходящего текста, если есть) и замена выделения вызывает событие только один раз и только если текст на самом деле изменения. Это может быть релевантной разницей.

Установка свойства Text подразумевает вызов SetWindowText, который отправляет сообщение WM_SETTEXT. Это активирует функцию сопоставления с образцом, что также приведет к следующему: Свойства свертывания регистра, нормализация символов в процедуре сопоставления регистра:

Данные поддерживают как реализации, требующие простого свертывания регистра (где длина строки не меняется), так и реализации, допускающие полное свертывание регистра (где длина строки может увеличиваться). Обратите внимание, что там, где они могут поддерживаться, полное складывание регистра лучше: например, они позволяют совпадать «MASSE» и «Maße».

person Jimi    schedule 07.06.2019
comment
Я понимаю, почему вы используете метод «Фокус». Основная проблема с SelectedText заключается в том, что он не переопределяет свойство Text. Он просто добавляет значение. Я бы предпочел сбросить свойство «Текст» вместо использования «Фокус» - person gangus; 09.06.2019
comment
Я предоставил этот метод по причине. Установка [ComboBox].Text = string.Empty вызывает событие TextChanged 3 раза, когда есть предыдущий выбор. [ComboBox].Focus(); плюс [ComboBox].SelectedText = "something"; только один раз и только в том случае, если текст действительно изменится. Может быть, это не имеет значения, может быть, это не так. Но теперь вы можете сказать Я понимаю, почему вы используете метод «Фокус». Итак, вы проверили оба и теперь у вас есть эта информация. Я добавлю эту деталь к ответу - person Jimi; 09.06.2019
comment
Я нашел другую проблему. Использование SelectedText устанавливает SelectedValue и SelectedItem с нулевым значением, а Text — нет. Значит, нужно их запомнить и восстановить. - person gangus; 09.06.2019
comment
Неа. SelectedItem имеет значение null, когда вы каким-либо образом изменяете текст, а новый текст не соответствует ни одному элементу в списке. - person Jimi; 09.06.2019