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. Для этого попробуйте одно из следующих:
Сохраните значение перечисления в словаре вместо строки:
Dim dUnits As New Dictionary(Of String, eUnits)
Сохраняйте целые числа в Словаре, но используйте целочисленное значение перечисления при поиске в 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)