Как описано в в этом ответе , мне удалось создать столбец со списком и заполнить имеющиеся у него параметры в следующих данных примера (перечисленных здесь в формате JSON);
[{"id": 0, "type": "never"},
{"id": 1, "type": "always"},
{"id": 2, "type": "sometimes"}]
Предположим, мы связываем данные следующим образом (myOptions - это некоторый вспомогательный класс, который возвращает указанные выше данные в виде двух членов класса, id и типа). Предположим, что имя столбца таблицы базы данных - 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 должен совпадать с именем столбца, который содержит значения (идентификаторы) для параметров поля со списком.
DisplayMember должен соответствовать имени столбца, который содержит отображаемый текст, для пользователя для параметров поля со списком.
При использовании списка опций (ручные данные, поэтому опции поля со списком не хранятся в базе данных, эти элементы опции (id
и type
в примере) должны быть реализованы as 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