У меня есть поле со списком, и я не хочу, чтобы пользователи также добавляли новые данные, но я также хочу позволить им ввести название объекта, который они хотят выбрать.
В настоящее время я использую этот код:
protected virtual void comboBoxAutoComplete_KeyPress(object sender, KeyPressEventArgs e) {
if (Char.IsControl(e.KeyChar)) {
//let it go if it's a control char such as escape, tab, backspace, enter...
return;
}
ComboBox box = ((ComboBox)sender);
//must get the selected portion only. Otherwise, we append the e.KeyChar to the AutoSuggested value (i.e. we'd never get anywhere)
string nonSelected = box.Text.Substring(0, box.Text.Length - box.SelectionLength);
string text = nonSelected + e.KeyChar;
bool matched = false;
for (int i = 0; i < box.Items.Count; i++) {
if (((DataRowView)box.Items[i])[box.DisplayMember].ToString().StartsWith(text, true, null)) {
//box.SelectedItem = box.Items[i];
matched = true;
break;
}
}
//toggle the matched bool because if we set handled to true, it precent's input, and we don't want to prevent
//input if it's matched.
e.Handled = !matched;
}
Хорошо работает для любого выпадающего списка, который использует данные, привязанные к базе данных, и нечувствителен к регистру. Тем не менее, если пользователь вводит что-то в неправильном случае, а затем выводит из выпадающего списка выбранное значение выпадающего списка по-прежнему равно -1 (или какому-либо предыдущему значению). Это не то поведение, которое мне нужно, я хочу, чтобы оно установило значение, которое в настоящее время является наилучшим предположением о том, что связывает пользователь, то есть параметр автозаполнения.
Я попробовал это, если вы видите закомментированную строку в цикле for. Это не работает.
Это выглядит примерно так:
У меня есть поле «Аренда» со значением 53
Я набираю 'r'
Я получаю результат 'RRent'
combobox.SelectedValue возвращает -1
Что он в данный момент делает:
У меня есть поле «Аренда» со значением 53
Я набираю 'r'
Автозаполнение предлагает "аренда"
Это правильное значение, поэтому я продолжаю, и поле со списком теряет фокус
Combobox отображает "аренда"
combobox.SelectedValue return -1
Что я хочу:
У меня есть поле «Аренда» со значением 53
Я набираю 'r'
Комбо-бокс теряет фокус, он заполняет «ренту» (хотя это не в правильном случае [уже делает это])
combobox.SelectedValue теперь должно возвращать 53
Я думаю, что настройка box.SelectedValue может быть лучше, но я не могу понять, как это сделать, по крайней мере, абстрагированным способом высокого уровня, если бы я знал, как комбинированный список делал это с ValueMemeber и элементом Display, я бы продублировал его но я не знаю.
У кого-нибудь есть предложения по устранению этой ошибки?