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から、選択している時間を引っ張ってくることができました。