Вы могли сцепить нажатие клавиши или textchanged событие и проверить это, введенный текст был начальным соответствием подстроки для по крайней мере одного из элементов списка, отклоняя нажатие клавиши (или удаляя новый символ) если нет. Единственная проблема, о которой я могу думать с этим, - то, что это может немного сбивать с толку пользователя, что некоторый вход не принят (особенно при вводе первого символа, в которой точке список автоматического заполнения еще не будет видим, таким образом, они не будут знать то, что допустимые значения).
Или просто используют его в dropdownlist режиме - люди могут все еще ввести, и это перейдет к первому элементу списка соответствия...
Путем я сделал, это должно проверить значение по списку возможных значений, когда они оставляют поле и не позволяют им оставить недопустимое значение. Я не знаю, как Вы хотели бы обработать его, когда Вы находите, что они ввели недопустимое значение, но это - то, что я сделал в прошлом.
Это может быть так просто:
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.listiteMes
? Это позволяет пользователю типа, но он принимает только слова, которые находятся в Combobox
. Единственный улов - это то, что поведение изменилось для Win7 (см. Combobox.SelecatedValue не совпадает с отображенным текстом, когда DropDownStyle = DropDownlist в Windows 7 ).
Что касается тегов, вы можете попробовать «Combobox» и «.NET».
Я хотел сделать то же самое и наткнулся на этот вопрос. Вот что я придумал.
Создайте обработчик события KeyDown для combobox и проверьте наличие клавиши Enter. Обратите внимание, что после нажатия клавиши Enter текст в комбинированном окне выделяется (как при операции вырезания или копирования), и фокус остается в комбинированном окне.
Если был нажат Enter, вызовите функцию валидации, которая сделает все, что вы считаете нужным, если введенное значение хорошее/плохое.
Вы можете вызвать эту же функцию в обработчике события Leave, чтобы не дать пользователю покинуть combobox, пока не будет сделан правильный выбор.
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.