我正在研究的项目广泛使用Enum来保存单位符号。像这样......
Public Enum AreaSym
unknown = 0
in2
mm2
End Enum
我的问题开始于我意识到我的Enum名称没有为我的ComboBox上的下拉菜做好名字。我从这个C#CodeProject http://www.codeproject.com/KB/cs/LocalizingEnums.aspx?msg=3746572找到并实现了一个TypeConverter ...它允许你在.Resx文件中分配Enum Values友好名称,并重载GetValues函数,以便它返回Enums友好名称。 .Resx文件。这很好用,然后我可以将组合框数据源直接分配给枚举。
ComboBox1.DataSource = System.Enum.GetValues(GetType(AreaSym))
然而,我意识到当以这种方式使用数据源时,我必须操纵数据源以在ComboBox中创建更改。比如,如果我不想向用户显示未知,我需要另一种方法来加载我的ComboBoxes。这是我决定制作List(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"
但是,我发现使用DataSource阻止我做两件事。
当表单加载时,我希望ComboBox本身显示为空,没有文本,或者在Text属性中显示我输入的文本。目前使用DataSource,它总是填充列表中的第一项。
我希望能够根据另一个列表中的项目选择轻松限制列表中的项目。经典的例子是两个组合框填充完全相同的值(1,2,3)& (1,2,3)。当你在ComboBox 1中选择1时,只有(2,3)可以在ComboBox 2中选择。
我意识到如果我使用Items而不是数据源,我可能很容易做到这一点,我只是不确定最好的方法是什么,因为我需要拥有密钥,值对枚举和字符串......