2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

列挙体で定義されている名前をコンボボックスにセットしたい

Last updated at Posted at 2017-10-16

初投稿なんでなんかおかしかったらすみません。

やりたいこと

画面からコンボボックスで項目を選択させたい。
ソース内からアクセスするために各項目のSelectedIndexインデックスも定義しとかないとならない。
でも項目名に関する情報を複数書きたくはない。
→ENUMで定義した名前を直接コンボボックスにセットしたらいいのでは?

どうする

書きたくないソース
Form1.vb
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

修正後ソース
Form1.vb
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でもセットできるみたいです。

つまり最終的にはこうかな。うん、見やすい。

Form1.vb
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を設定すればよいです。

2
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?