IndexOf ComboBox просто не будет работать для меня

VB2010. Я пытаюсь заполнить ComboBox содержимым Перечисления единиц. Мне удалось сделать это с помощью словаря. Что-то вроде

Dim dUnits As New Dictionary(Of String, Integer)
Dim da As String

For Each enumValue As eUnits In System.Enum.GetValues(GetType(eUnits))
   da = ConvertEnumToCommonName 'gets unique name for an enumeration
   dUnits.Add(da, enumValue)
Next

cbo.DisplayMember = "Key"   'display the the common name
cbo.ValueMember = "Value"   'use the enumeration as the value
cbo.DataSource = New BindingSource(dUnits, Nothing)

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

Dim defUnits As eUnits = eUnits.Feet
Dim idx As Integer = cbo.Items.IndexOf(defUnits) 'doesnt work, returns a -1
cbo.SelectedIndex = idx

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

1 ответ

Решение

Прежде всего, у вас есть коллекция целых чисел, и вы ищете значение enum. Для этого попробуйте одно из следующих:

  1. Сохраните значение перечисления в словаре вместо строки:

    Dim dUnits As New Dictionary(Of String, eUnits)
    
  2. Сохраняйте целые числа в Словаре, но используйте целочисленное значение перечисления при поиске в ComboBox:

    Dim idx As Integer = cbo.Items.IndexOf(CInt(defUnits))
    

Но это пока не сработает. Вы привязаны к данным Dictionary, что означает предметы в cbo.Items не типа enum, а типа элементов в словаре (KeyValuePair(Of String, eUnits) при условии № 1 выше).

Самое простое решение - просто установить SelectedValue свойство поля со списком вместо SelectedIndex, Предполагая, что вы использовали вариант № 1 выше, это будет:

cbo.SelectedValue = defUnits

Если вы использовали вместо этого вариант №2, вам сначала нужно преобразовать это в целое число:

cbo.SelectedValue = CInt(defUnits)
Другие вопросы по тегам