TIL

Today I Leaned. 仕事で知ったことや、つまづいたことを時間のある時にメモしておく

DataGridViewのコンボボックスの列を追加する。

「コンボボックスの表示のテキスト」と「実際の値」を別にして、コンボボックスを表示するにはDataGridViewComboBoxColumnDataSourceに設定する必要がある。

こんな感じでやりたい

f:id:tmg1998:20171206133912p:plain

以下、ソース

ChoiceContainerクラスは項目を格納するためのクラスとなっている

' テキスト列の追加
DetailDataGridView1.Columns.Add(
    New DataGridViewTextBoxColumn With {
        .HeaderText = "名前",
        .DataPropertyName = "Name"
    }
)

' -----------------------------------------------
' == コンボボックスの項目リストの作成 ==
Dim choiceList As New List(Of ChoiceContainer)

choiceList.Add(New ChoiceContainer("1", "男"))
choiceList.Add(New ChoiceContainer("2", "女"))

' == 列の作成 ==
Dim cmbBoxCol As New DataGridViewComboBoxColumn

cmbBoxCol.HeaderText = "性別"
' DataGridView1.DataSourceに設定したデータ内で表示したいプロパティと同じ名前
cmbBoxCol.DataPropertyName = "Gender"

' コンボボックスの項目リストを設定する
cmbBoxCol.DataSource = choiceList

' コンボボックスに表示するコンテナ(ChoiceContainer)のプロパティ(ValueとDisplayText)と一致させる
cmbBoxCol.DisplayMember = "DisplayText"
cmbBoxCol.ValueMember = "Value"

' 列へ追加
DataGridView1.Columns.Add(cmbBoxCol)


' 表示データ作成
Dim testList As New List(Of Test)
testList.Add(New Test("太郎", "1"))
testList.Add(New Test("花子", "2"))

DataGridView1.DataSource = TestList
''' <summary>
''' コンボボックスの項目コンテナ
''' </summary>
Public Class ChoiceContainer
    ''' <summary>実際の値</summary>
    Public Property Value As String

    ''' <summary>表示テキスト</summary>
    Public Property DisplayText As String

    Public Sub New(ByVal value As String, ByVal displayText As String)
        Me.Value = value
        Me.DisplayText = displayText
    End Sub
End Class
Public Class Test
    Public Property Name As String
    Public Property Gender As String

    Public Sub New(name As String, gender As String)
        Me.Name = name
        Me.Gender = gender
    End Sub
End Class