如this answer 中所述,我设法创建了一个组合框列并使用以下示例数据填充它的“选项”(此处以 JSON 格式列出);
[{"id": 0, "type": "never"},
{"id": 1, "type": "always"},
{"id": 2, "type": "sometimes"}]
假设我们像这样绑定数据(myOptions 是一些帮助类,它返回上面的数据,作为两个类成员,id 和 type)。假设数据库表列名是'hasOption':
myDataGridView.Columns.Remove("hasOption")
Dim newColumn As New DataGridViewComboBoxColumn()
newColumn.DataSource = myOptions.GetChoices()
newColumn.DataPropertyName = "hasOption"
newColumn.ValueMember = "id"
newColumn.DisplayMember = "type"
newColumn.Name = "hasOption"
myDataGridView.Columns.Add(newColumn)
这里的重要事实是:
DataPropertyName必须与数据源列名(数据库表列名)完全匹配
ValueMember 必须与包含组合框选项的值 (ID) 的列的名称相匹配。
DisplayMember 必须与包含组合框选项的用户显示文本的列的名称相匹配。
当使用选项列表(手动数据,因此组合框选项不存储在数据库中时,这些选项成员(示例中为id 和type)必须是实现为properties。将自定义列添加到DataGridView 时,仅使用公共类成员会导致奇怪的错误。
value成员类的实现如下:
Public Class myOptions
Public Property type As String
Public Property id As Integer
Public Sub New(ByVal nType As String, ByVal nID As Integer)
type = nType
id = nID
End Sub
Private Shared allValues As List(Of myOptions) = New List(Of myOptions) From {
New myOptions("never", 0),
New myOptions("always", 1),
New myOptions("sometimes", 2)
}
Public Shared Function GetChoices() As List(Of myOptions)
Return allValues
End Function
End Class