初投稿なんでなんかおかしかったらすみません。
やりたいこと
画面からコンボボックスで項目を選択させたい。
ソース内からアクセスするために各項目のSelectedIndexインデックスも定義しとかないとならない。
でも項目名に関する情報を複数書きたくはない。
→ENUMで定義した名前を直接コンボボックスにセットしたらいいのでは?
どうする
書きたくないソース
Public Class Form1
Enum 飲み物一覧 As Integer
お茶 = 0
コーラ = 1
コーヒー = 2
End Enum
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.ComboBox1.Items.Add("お茶")
Me.ComboBox1.Items.Add("コーラ")
Me.ComboBox1.Items.Add("コーヒー")
End Sub
End Class
indexに関する情報とコンボボックスに関する情報が別々に定義されていてなんか嫌
調べると[Enum].GetValues(GetType(飲み物一覧))でEnumの一覧が取れるみたいなのでこれを使う。
ちなみに以下のようにするとArrayで取れる
CType([Enum].GetValues(GetType(飲み物一覧)), 飲み物一覧())
以下のようにするとListで取れる
[Enum].GetValues(GetType(飲み物一覧)).Cast(Of 飲み物一覧).ToList()
後は適当にコンボボックスにセットしたらOK
修正後ソース
Public Class Form1
Enum 飲み物一覧 As Integer
お茶 = 0
コーラ = 1
コーヒー = 2
End Enum
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim drinks() = CType([Enum].GetValues(GetType(飲み物一覧)), 飲み物一覧())
For Each s In drinks
Me.ComboBox1.Items.Add(s)
Next
End Sub
End Class
取ってきたdrinksをFor Eachで回さずにMe.ComboBox1.Items.AddRange(drinks)みたいなことがやりたかったんだけどなんかダメでした。
もう少しなんかいいやり方あるかなー?
追記
コメントで頂いた情報で、コンボボックスのDataSourceにセットすればまとめてセットできました。
Me.ComboBox1.DataSource = drinks
DataSourceにはデータテーブルなんかをセットするって先入観がありましたがListもセットできたんですね。
ちなみにListでもArrayでもセットできるみたいです。
つまり最終的にはこうかな。うん、見やすい。
Public Class Form1
Enum 飲み物一覧 As Integer
お茶 = 0
コーラ = 1
コーヒー = 2
End Enum
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.ComboBox1.DataSource = CType([Enum].GetValues(GetType(飲み物一覧)), 飲み物一覧())
End Sub
End Class
なおDataSourceにセットすると先頭項目が勝手に初期選択されるので、Addしてた時と同じように初期選択無しにしたければSelectedIndex=-1を設定すればよいです。