Используете функцию автозаполнения ComboBox, ограничивая значения теми, которые указаны в списке?

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
0
26 189
9

Ответы 9

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

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

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

1. Все нажатия клавиш очень утомительны: вам нужно искать разные клавиши, такие как BACKSPACE, ESCAPE, ENTER и т. д. 2. Список не отсортирован, но очень длинный, поэтому удобно, что появляется список (хотя, возможно, это тоже сбивает с толку).

Schmuli 14.01.2009 20:22

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

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

Другие вопросы по теме