ComboBoxにValueとTextを持たせたい

いやぁ、Windowsプログラミングってやったことないからサッパリ。HTMLのSELECTタグみたいに簡単にValueとTextを持たせられるのかなぁ。と思ったら、そうでもないらしい…。でも、SelectedValueっていうプロパティはあるので、なんか方法があるんだろーなー。それとも、このプロパティってDataSourceでDataSetとかと結びつけた場合だけしか使えないの?

Public Class Time
    Inherits System.Windows.Forms.UserControl

#Region " Windows フォーム デザイナで生成されたコード "

    Private Sub Time_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '時を作成
        For I As Integer = 0 To 23
            Me.cmbHour.Items.Add(New ListItem(I.ToString, i.ToString & "時"))
        Next

        '分を作成
        For I As Integer = 0 To 59
            Me.cmbMinute.Items.Add(New ListItem(I.ToString, i.ToString & "分"))
        Next

    End Sub
End Class

Public Class ListItem

    Public Value As String
    Public Text As String

    Sub New(ByVal value As String, ByVal text As String)

        Me.Value = value
        Me.Text = text

    End Sub

    Public Overrides Function ToString() As String
        Return Text
    End Function

End Class

というわけで、こんな感じにしてみました。
ComboBoxで表示される値はObjectのtoStringを参照するらしいんで。
いいのかな。こんなんで。

  • 追記

ダメな事が判明。
いや、ダメじゃないんだが、考えてみるとcombobox.SelectedValueで値が引っ張ってこれない事が判明。そりゃそうだ、combobox.ValueMemberに値を与えてねぇんだもん

というわけで、ArrayListを使ってDataSourceにバインドする方法で再挑戦。

Public Class Time
    Inherits System.Windows.Forms.UserControl

#Region " Windows フォーム デザイナで生成されたコード "

    Private Sub Time_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '時を作成
        Dim aryHour As New ArrayList
        For I As Integer = 0 To 23
            aryHour.Add(New ListItem(I.ToString, I.ToString & "時"))
        Next
        'ComboBoxに割り当て
        Me.cmbHour.DataSource = aryHour
        Me.cmbHour.DisplayMember = "Text"
        Me.cmbHour.ValueMember = "Value"

        '分を作成
        Dim aryMinute As New ArrayList
        For I As Integer = 0 To 59
            aryMinute.Add(New ListItem(I.ToString, I.ToString & "分"))
        Next
        'ComboBoxに割り当て
        Me.cmbMinute.DataSource = aryMinute
        Me.cmbMinute.DisplayMember = "Text"
        Me.cmbMinute.ValueMember = "Value"

    End Sub
End Class

Public Class ListItem

    Private myValue As String
    Private myText As String

    Public Sub New(ByVal Value As String, ByVal Text As String)
        Me.myValue = Value
        Me.myText = Text
    End Sub

    Public ReadOnly Property Value() As String
        Get
            Return myValue
        End Get
    End Property

    Public ReadOnly Property Text() As String
        Get
            Return myText
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return Text
    End Function

End Class

MSDN参考。
これで、selectedValueから、選択している時間を引っ張ってくることができました。