2列の値を持つコンボボックス[コード+値]

コンボボックスで選択された値に対応する別の値を取得することができます。

例えば、表示は「部署名」取得する値は「部署コード」とすることができます。

実装例

「部署名」と「部署コード」を持つクラスを用意します。

Public Class Department
    Protected m_strCode As String
    Protected m_strDepartment As String

    Public Sub New(ByVal strCode As String, ByVal strDepartment As String)
        Me.m_strCode = strCode
        Me.m_strDepartment = strDepartment
    End Sub

    Public ReadOnly Property Code() As String
        Get
            Return m_strCode
        End Get
    End Property

    Public ReadOnly Property Department() As String
        Get
            Return m_strDepartment
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return Me.Code + " - " + Me.Department
    End Function
End Class

次に上記「Department」を「ArrayList」を使ってリスト化しコンボボックスの【DataSource】 にセットします。

コンボボックスのプロパティには【DisplayMember】と【ValueMember】が用意されており このプロパティに「Department」クラスのプロパティを指定します。

【DisplayMember】には、画面に表示する値が取得できるプロパティを指定し、【ValueMember】 には、取得したい値のプロパティを指定します。

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

    Dim Departments As New ArrayList()
    Departments.Add(New Department("0001", "営業"))
    Departments.Add(New Department("0002", "企画"))
    Departments.Add(New Department("0003", "経理"))
    AddHandler ComboBox1.SelectedValueChanged, AddressOf ComboBox1_SelectedValueChanged
    ComboBox1.DataSource = Departments
    ComboBox1.DisplayMember = "Department"
    ComboBox1.ValueMember = "Code"

End Sub
Private Sub ComboBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As EventArgs)
    If ComboBox1.SelectedIndex <> 0 Then
        ComboBox1.Text = ComboBox1.SelectedValue.ToString()
    End If
End Sub

上記例では、SelectedValue プロパティが変更された場合、Textプロパティに ComboBox1.ValueMemberに設定したDepartmentのプロパティ(Code)をセットします。

ComboBox1.SelectedValueは、Objectを返すようなのでもう少し拡張できそうです。次回かな?