Как заполнить DataGridViewComboBoxColumn?

Извините, если это должно быть очевидным, но это мой первый проект с использованием VB.NET, и некоторые вещи до сих пор мне недоступны.

Я пытаюсь настроить поле со списком внутри DataGridView, но я продолжаю получать

System.ArgumentException: значение DatagridviewComboBoxCell недопустимо

Я гуглю это уже 2 часа, и мне кажется, что я настраиваю все правильно, но, вероятно, что-то не так.

Dim imageCol As DataGridViewImageColumn
Dim checkCol As DataGridViewCheckBoxColumn
Dim col As DataGridViewColumn
Dim comboCol As DataGridViewComboBoxColumn
Dim ds As DataSet
Dim som As New SomStructure
Dim somministrazioni() As SomStructure = {}

With dgvListaAttivita
    .Columns.Clear()
    .AutoGenerateColumns = False
    .ReadOnly = False
    .EditMode = DataGridViewEditMode.EditOnEnter
    .CausesValidation = False

    somministrazioni.Clear
    ds = getSomministrazioni(codevalue, Today())
    If ds IsNot Nothing Then
        For Each row As DataRow In ds.Tables(0).Rows
            som.idOspite = row(0)
            som.nomeOspite = row(1)
            som.descrizioneSomministrazione = row(2)
            som.idOperatore = row(3)
            som.nomeOperatore = row(4)
            som.preparata = False
            somministrazioni.Add(som)
        Next
    End If

    .DataSource = somministrazioni

    imageCol = New DataGridViewImageColumn
    imageCol.Width = 25
    imageCol.ImageLayout = DataGridViewImageCellLayout.Normal
    imageCol.Description = "delete"
    imageCol.Image = My.Resources.note
    .Columns.Add(imageCol)


    col = New DataGridViewColumn
    col.DataPropertyName = "descrizioneSomministrazione"
    col.HeaderText = "Somministrazione"
    col.ValueType = GetType(String)
    col.CellTemplate = New DataGridViewTextBoxCell
    col.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    col.ReadOnly = True
    .Columns.Add(col)


    comboCol = New DataGridViewComboBoxColumn
    Dim dt As DataTable = dsOperatori.Tables(0)
    comboCol.DataSource = dt
    comboCol.DisplayMember = "display"
    comboCol.ValueMember = "idoperatore"
    comboCol.DataPropertyName = "idOperatore"
    comboCol.HeaderText = "Operatore"
    comboCol.ValueType = GetType(Integer)
    comboCol.CellTemplate = New DataGridViewComboBoxCell
    comboCol.Width = 150
    .Columns.Add(comboCol)


    checkCol = New DataGridViewCheckBoxColumn
    checkCol.DataPropertyName = "preparata"
    checkCol.HeaderText = "P."
    checkCol.ValueType = GetType(Boolean)
    checkCol.CellTemplate = New DataGridViewCheckBoxCell
    checkCol.Width = 20
    .Columns.Add(checkCol)

End With

Как я понял должно быть так:

comboCol.DataSource = dt
comboCol.DisplayMember = "display"
comboCol.ValueMember = "idoperatore"

указывает источник данных и ключевые/отображаемые значения полей со списком в столбце

comboCol.DataPropertyName = "idOperatore"

Является ли имя столбца связанным как с DataSource DataGridView, так и с ValueMember ComboBox, и оно должно отображать разные варианты выбора в разных строках.

Если я удаляю DataPropertyName из кода, я больше не получаю ошибку, но также получаю пустые поля со списком.


comment
Попробуйте закомментировать эту строку comboCol.CellTemplate = New DataGridViewComboBoxCell   -  person LarsTech    schedule 04.05.2018
comment
Это было так, спасибо. Хотя я должен спросить, потому что я нахожу это странным, почему это нужно другим столбцам, а типу поля со списком - нет?   -  person des    schedule 07.05.2018
comment
Не уверен, почему. Я просто взял ваш код и закомментировал эту строку. Мне редко приходится устанавливать это свойство всякий раз, когда мне приходится самому использовать DataGridView, поэтому я решил протестировать его.   -  person LarsTech    schedule 07.05.2018


Ответы (1)


Попробуйте закомментировать строку шаблона:

comboCol = New DataGridViewComboBoxColumn
Dim dt As DataTable = dsOperatori.Tables(0)
comboCol.DataSource = dt
comboCol.DisplayMember = "display"
comboCol.ValueMember = "idoperatore"
comboCol.DataPropertyName = "idOperatore"
comboCol.HeaderText = "Operatore"
comboCol.ValueType = GetType(Integer)
'comboCol.CellTemplate = New DataGridViewComboBoxCell
comboCol.Width = 150
.Columns.Add(comboCol)
person LarsTech    schedule 07.05.2018