Используя функцию автозаполнения ComboBox, ограничивая значения в списке? - PullRequest
17 голосов
/ 14 января 2009

В WinForms 2.0 ComboBox имеет функцию автозаполнения, которая отображает пользовательский выпадающий список только со значениями, которые начинаются с введенного текста.

Однако, если я хочу ограничить допустимые значения только теми, которые появляются в списке элементов ComboBox, я могу сделать это, установив для DropDownStyle значение DropDownList, что не позволяет пользователю вводить значение.

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

Есть ли другой способ ограничить ввод в список, но при этом разрешить использование функции автозаполнения? Обратите внимание, что я видел некоторые собственные решения для этого, но мне действительно нравится, как соответствующие элементы автозаполнения отображаются в раскрывающемся списке и сортируются, даже если исходный список может не быть.

РЕДАКТИРОВАТЬ: я думал только о проверке введенного значения, то есть о тестировании пользовательского ввода, если оно допустимо, например, в событии TextChanged, или даже при использовании события Validating. Тогда возникает вопрос: каково ожидаемое поведение? Я очищаю их значение (пустое значение также недопустимо), или я использую значение по умолчанию? Ближайшее совпадающее значение?

P.s. Есть ли другие теги, которые я мог бы добавить к этому вопросу?

Ответы [ 9 ]

4 голосов
/ 01 мая 2013

Это решение сработало для меня:

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
4 голосов
/ 13 января 2010

Вы пробовали установить AutoCompleteMode = AutoCompleteMode.SuggestAppend и AutoCompleteSource = AutoCompleteSource.ListItems? Это позволяет пользователю печатать, но принимает только те слова, которые находятся в ComboBox. Единственный улов заключается в том, что поведение изменилось для Win7 (см. ComboBox. Выбранное значение не соответствует отображаемому тексту, когда DropDownStyle = DropDownList в Windows 7 ).

Что касается тегов, вы можете попробовать "combobox" и ".net".

3 голосов
/ 08 августа 2009

Это может быть так просто:

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
2 голосов
/ 14 января 2009

Вы можете перехватить событие нажатия клавиши или текстового изменения и проверить, что введенный текст был начальным совпадением подстроки хотя бы для одного из элементов списка, отклонив нажатие клавиши (или удалив самый последний символ), если нет. Единственная проблема, с которой я могу подумать, это то, что пользователь может немного сбить с толку тем, что некоторые входные данные не принимаются (особенно при вводе первого символа, когда список автозаполнения еще не будет виден, поэтому он выиграл не знаю, какие допустимые значения).

Или просто используйте его в режиме выпадающего списка - люди могут все еще печатать, и он перейдет к первому подходящему элементу списка ...

1 голос
/ 08 июня 2010

Вы можете установить «свойство SuggestAppend для SuggestAppend» и «AutoCompleteSource» для «ListItems», которые будут перечислять и добавлять введенные вами символы в выпадающий список. Также, если не выбрано, то для раскрывающегося списка будет выбран даже соответствующий ValueMemeber.

0 голосов
/ 06 октября 2016

Это сработало для меня. Я использовал 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
0 голосов
/ 21 октября 2011

У меня та же проблема ... Я задал тот же вопрос ( Как заставить пользователя принять предложенную запись в ComboBox? ), а затем я реализовал ее с помощью событий, но Я получил много кода, который можно улучшить, обобщив поведение ... скажите, пожалуйста, легко ли это. Спасибо!

0 голосов
/ 10 марта 2010

Я хотел сделать то же самое и наткнулся на этот вопрос. Вот что я придумала.

Создайте обработчик событий 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();
   }
}

Или что-то в этом роде, но вы поняли.

0 голосов
/ 14 января 2009

Я сделал так, чтобы проверить значение по списку возможных значений, когда они выходят из поля, и не позволять им оставлять недопустимое значение. Я не знаю, как вы захотите справиться с этим, когда обнаружите, что они ввели неверное значение, но это то, что я делал в прошлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...