VB.Net ComboBox - Перечисления и предельные значения, основанные на выборе в другом ComboBox - PullRequest
2 голосов
/ 22 сентября 2011

Проект, над которым я работаю, широко использует Enum для хранения символов юнитов.Вот так ...

Public Enum AreaSym
    unknown = 0
    in2
    mm2
End Enum

Мои проблемы начались, когда я понял, что мои имена в Enum не дают хороших имен для выпадающих списков на моих списках.Я нашел и реализовал TypeConverter из этого C # CodeProject http://www.codeproject.com/KB/cs/LocalizingEnums.aspx?msg=3746572 ... Он позволяет назначать дружественные имена Enum Values ​​в файле .Resx и перегружает функцию GetValues, так что он возвращает дружественные имена Enums изфайл .Resx.Это работает хорошо, так как я могу назначить источник данных в выпадающем списке прямо в enum.

ComboBox1.DataSource = System.Enum.GetValues(GetType(AreaSym))

Однако я понял, что при использовании источника данных таким образом, мне приходится манипулировать источником данных, чтобы создать изменение в ComboBox.Например, если я не хочу отображать неизвестное пользователю, мне понадобится другой способ загрузки моих комбинированных списков.Именно тогда я решил создать список (Of KeyValuePair (AreaSym, String))

Public Function AreaSymbols() As List(Of KeyValuePair(Of AreaSym, String))
    AreaSymbols = New List(Of KeyValuePair(Of AreaSym, String))
    AreaSymbols.Add(New KeyValuePair(Of AreaSym, String)(AreaSym.in2, "in²"))
    AreaSymbols.Add(New KeyValuePair(Of AreaSym, String)(AreaSym.mm2, "mm²"))
    Return AreaSymbols
End Function

Это здорово, потому что теперь я могу точно контролировать, что входит в поле со списком, используя список.

ComboBox1.DataSource = UnitNameList.AreaSymbols
ComboBox1.DisplayMember = "Value"
ComboBox1.ValueMember = "Key"

Однако я обнаружил, что использование источника данных не позволяет мне делать две вещи.

  1. Когда форма загружается, я хочу, чтобы сам ComboBoxпоказывать либо пустой, без текста, либо показывать текст, который я ввел в свойстве Text.В настоящее время, используя DataSource, он всегда заполняется первым элементом в списке.

  2. Я хотел бы иметь возможность легко ограничивать элементы в списке на основе выбора элементов в другом списке.Классическим примером могут быть два поля со списком, заполненные одинаковыми значениями (1,2,3) и (1,2,3).Когда вы выбираете 1 в ComboBox, для выбора в ComboBox 2 доступны только (2,3).

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

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