Vb.net 如何填充DataGridViewComboBoxColumn列?

Vb.net 如何填充DataGridViewComboBoxColumn列?,vb.net,datagridview,datagridviewcomboboxcell,datagridviewcomboboxcolumn,Vb.net,Datagridview,Datagridviewcomboboxcell,Datagridviewcomboboxcolumn,很抱歉,如果这是显而易见的,但这是我第一个使用VB.NET的项目,有些事情我仍然无法理解 我正试图在DataGridView中设置一个组合框,但我一直在 System.ArgumentException:DatagridviewComboBoxCell值无效 我已经在谷歌上搜索了2个小时了,对我来说,似乎我的设置是正确的,但可能有什么地方不对劲 Dim imageCol As DataGridViewImageColumn Dim checkCol As DataGridViewCheckBox

很抱歉,如果这是显而易见的,但这是我第一个使用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"
是链接到DataGridView的数据源和ComboBox的ValueMember的列的名称,它应该在不同的行上显示不同的选择


如果我从代码中删除DataPropertyName,我将不再得到错误,但也会得到空的组合框。

尝试注释模板行:

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)

尝试注释这一行,谢谢。虽然我不得不问,因为我觉得它很奇怪,为什么其他栏目需要它,而组合框类型不需要?不知道“为什么”。我只是把你的代码注释掉了。每当我必须自己使用DataGridView时,我很少需要设置该属性,因此我需要对其进行测试。