「コンボボックスの基本的な使い方」の中で コンボボックスの項目のコレクションとしての Itemsプロパティに文字列を設定していますが、 この文字列の代わりにクラスのデータを設定する方法を示します。
クラス名を ComboItemとし表示文字列とコードを内部に持ったクラスを宣言します。
以下にソースを示します。ここで重要なのは、ToString()メソッドを宣言することで、 コンボボックスの選択時に文字列として表示されるのが、このメソッドの戻り値が使用されるためです。
'''''' コンボボックスのItemsに設定される、表示文字列とコードを持ったクラス ''' Public Class ComboItem 'コードデータ退避 Private mintCode As Integer '表示文字列データ退避 Private mstrText As String '''''' 文字列プロパティ ''' Public ReadOnly Property Text As String Get Return Me.mstrText End Get End Property '''''' コードプロパティ ''' Public ReadOnly Property Code As Integer Get Return Me.mintCode End Get End Property '''''' クラスデータの表示文字列を返す ''' '''表示文字列 '''ComboBoxの表示部分には、ToString()メソッドの内容が表示される Public Overrides Function ToString() As String Return mstrText End Function '''''' コンストラクタ ''' '''コード '''表示文字列 Public Sub New(ByVal intCode As Integer, ByVal strText As String) mintCode = intCode mstrText = strText End Sub End Class
さてこのクラスを使用したコンボボックスへの設定ですが、以下のソースを見て下さい。
その後、フォームロードイベントでコンボボックスの Itemsプロパティ(ObjectCollection) に、4個クラスデータを生成し追加で初期化を行います。
ボタン1クリックイベントでは、 選択されているIndexの取得を行い、値が -1 で無ければ、 コンボボックスの選択値を取得し、クラスデータとしてキャストしたものから、コード及び文字列を取得し表示します。
ボタン2クリックイベントでは、コンボボックスの選択を解除します。
コンボボックスのItemsプロパティにクラスデータを設定する方法
Public Class frmComboBoxItemsClass ' ===== ' 実際はここに上のクラス宣言がある ' ===== '''''' フォームロードイベント ''' Private Sub frmComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load 'コンボボックス初期化 With Me.ComboBox1 .DropDownStyle = ComboBoxStyle.DropDownList 'クラスを使用してコンボボックスへの設定 Dim cboItem As ComboItem cboItem = New ComboItem(10, "あいうえお") .Items.Add(cboItem) cboItem = New ComboItem(20, "かきくけこ") .Items.Add(cboItem) cboItem = New ComboItem(30, "さしすせそ") .Items.Add(cboItem) cboItem = New ComboItem(40, "たちつてと") .Items.Add(cboItem) End With End Sub '''''' ボタンクリックイベント・選択状態の表示 ''' Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '選択されているIndexの取得 Dim intIdx As Integer = Me.ComboBox1.SelectedIndex If intIdx <> -1 Then '選択されている項目の取得(クラスデータへのキャスト) Dim cboItem As ComboItem = CType(Me.ComboBox1.SelectedItem, ComboItem) '結果表示 Dim strDsp As String = "コード : " & cboItem.Code & vbCrLf & "文字列 : " & cboItem.Text MsgBox(strDsp, MsgBoxStyle.OkOnly, Me.Text) Else MsgBox("未選択!!", MsgBoxStyle.OkOnly, Me.Text) End If End Sub '''''' ボタンクリックイベント・選択状態の解除 ''' Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '選択されている状態を解除 Me.ComboBox1.SelectedIndex = -1 End Sub End Class
結果これを実行しますと、以下の様になります。
ボタン1のクリック時は以下の様になります。
ボタン2のクリック時はコンボボックスの選択が解除され何も表示されないはずです。
尚、フォームロードイベントでのコンボボックスへの初期化ですが、 クラスデータの配列を宣言し、AddRangeを使って以下の様に書き換えることもできます。
'''''' フォームロードイベント ''' Private Sub frmComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load 'コンボボックス初期化 With Me.ComboBox1 .DropDownStyle = ComboBoxStyle.DropDownList Dim cboItems() As ComboItem = { New ComboItem(10, "あいうえお"), New ComboItem(20, "かきくけこ"), New ComboItem(30, "さしすせそ"), New ComboItem(40, "たちつてと") } .Items.AddRange(cboItems) End With End Sub
関連する記事
⇒コンボボックスの基本的な使い方(項目に文字列のみを設定)⇒ComboBoxの簡単な拡張クラス(枠線色の描画):[WndProc,CreateGraphics,DrawRectangle]
コメント