В WinForms 2.0 ComboBox имеет функцию автозаполнения, которая отображает настраиваемый раскрывающийся список только со значениями, которые начинаются с введенного текста.
Однако, если я хочу ограничить допустимые значения только теми, которые отображаются в списке элементов ComboBox, я могу сделать это, установив для DropDownStyle значение DropDownList, что не позволяет пользователю вводить значение.
Однако теперь я не могу использовать функцию автозаполнения, которая требует ввода данных пользователем.
Есть ли другой способ ограничить ввод в список, но при этом разрешить использование функции автозаполнения? Обратите внимание, что я видел несколько специальных решений для этого, но мне очень нравится, как соответствующие элементы автозаполнения отображаются в раскрывающемся списке и сортируются, даже если исходный список может не отображаться.
Обновлено: Я подумал о том, чтобы просто проверить введенное значение, то есть проверить ввод пользователя, если он действителен, скажем, в событии TextChanged или даже с использованием события Validating. Тогда возникает вопрос, каково ожидаемое поведение? Я очищаю их значение (пустое значение также недействительно) или использовать значение по умолчанию? Ближайшее совпадающее значение?
P.s. Есть ли еще какие-нибудь теги, которые я мог бы добавить к этому вопросу?





Я сделал это так, чтобы проверить значение по списку возможных значений, когда они покидают поле, и не позволять им оставлять недопустимое значение. Я не знаю, как вы хотели бы справиться с этим, если обнаружите, что они ввели недопустимое значение, но это то, что я делал в прошлом.
Вы можете перехватить событие нажатия клавиши или textchanged и подтвердить, что введенный текст является начальным совпадением подстроки хотя бы для одного из элементов списка, отклоняя нажатие клавиши (или удаляя самый последний символ), если нет. Единственная проблема, которую я могу придумать, это то, что пользователя может немного сбить с толку то, что некоторый ввод не принимается (особенно при вводе первого символа, после чего список автозаполнения еще не будет виден, поэтому они выиграли не знаю, что это за допустимые значения).
Или просто используйте его в режиме раскрывающегося списка - люди все еще могут вводить текст, и он переходит к первому соответствующему элементу списка ...
Это может быть так просто:
Private Sub cbx_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles cbxZip.Validating, cbxCity.Validating, cbxCountry.Validating
'Prerequisites: object: combobox, style: dropdownlist,
'autocompletesource=listitems, autocompletemode<>none
'check if the typed value is in the list, else cancel
'if the value isn't found, 'findstring' will return -1
'if cancel is set to True, one can't leave the field
e.Cancel = sender.FindStringExact(sender.Text) < 0
'make it obvious to the user there is an issue
If e.Cancel Then Beep()
End Sub
Вы пробовали ставить AutoCompleteMode = AutoCompleteMode.SuggestAppend и AutoCompleteSource = AutoCompleteSource.ListItems? Это позволяет пользователю печатать, но принимает только слова из ComboBox. Единственная загвоздка в том, что поведение Win7 изменилось (см. ComboBox.SelectedValue не соответствует отображаемому тексту, если DropDownStyle = DropDownList в Windows 7).
Что касается тегов, вы можете попробовать combobox и .net.
Я хотел сделать то же самое и наткнулся на этот вопрос. Вот что я придумал.
Создайте обработчик событий KeyDown для поля со списком и проверьте наличие клавиши Enter. Обратите внимание, что после того, как пользователь нажимает, текст в поле со списком выбирается (как в, выбран, как если бы вы выполняли операцию вырезания или копирования), а фокус остается в поле со списком.
Если был нажат ввод, вызовите функцию проверки, которая сделает все, что вы считаете нужным, если введенное значение хорошее / плохое.
Вы можете вызвать эту же функцию в обработчике события Leave, чтобы предотвратить выход пользователя из поля со списком до тех пор, пока не будет сделан правильный выбор.
private void uxWidgetsComboBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
ValidateSelection();
}
}
private void uxWidgetsComboBox_Leave(object sender, EventArgs e)
{
if (!ValidateSelection())
{
uxWidgetsComboBox.Focus();
}
}
Или что-то в этом роде, но идею вы поняли.
Вы можете установить для свойства «SuggestAppend» значение «SuggestAppend» и «AutoCompleteSource» значение «ListItems», которые будут отображать и добавлять введенные вами символы в раскрывающийся список. Также, если не выбран, то в раскрывающемся списке будет выбран даже соответствующий ValueMemeber.
У меня та же проблема ... Я задал тот же вопрос (Как заставить пользователя сделать предложенный вход в ComboBox?), а затем я реализовал его с помощью событий, но у меня есть много кода, который можно улучшить, обобщив поведение ... пожалуйста, скажите мне, есть ли у вас это легко. Спасибо!
Это решение сработало для меня:
Private Sub myComboBox_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles myComboBox.Validating
If Not myComboBox.Items.Contains(myComboBox.Text) Then
MsgBox("Please select a value from the list", MsgBoxStyle.Exclamation, "Value not available")
e.Cancel = True
End If
End Sub
Это сработало для меня. Я использовал DataTable в качестве источника данных
With cbo
.AutoCompleteSource = AutoCompleteSource.ListItems
.AutoCompleteMode = AutoCompleteMode.SuggestAppend
End With
Private Sub cbo_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles cbo.Validating
If cbo.SelectedItem Is Nothing Then
MessageBox.Show("Value entered not valid", "Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
e.Cancel = True
End If
End Sub
1. Все нажатия клавиш очень утомительны: вам нужно искать разные клавиши, такие как BACKSPACE, ESCAPE, ENTER и т. д. 2. Список не отсортирован, но очень длинный, поэтому удобно, что появляется список (хотя, возможно, это тоже сбивает с толку).