Не уверен, что вы все еще ищете, но я только что столкнулся с той же проблемой. Вот как я к этому обратился, надеюсь, он вам пригодится.
Определите функцию, которая возвращает DataGridViewComboCell с соответствующим набором источника данных (объекты коллекции, определенные в другом месте, обратите внимание, что я использую EntitySpaces в этом примере для заполнения DataSource):
Private Function GetStockComboDataSource(ByVal type As eStockComboType) As DataGridViewComboBoxCell
Try
Dim cell As New DataGridViewComboBoxCell
Select Case type
Case eStockComboType.StockIn
cell.DataSource = Me.StockInCol.Query.LoadDataTable
cell.DisplayMember = "FullName"
cell.ValueMember = JCStockInMetadata.ColumnNames.StockItemID
Case eStockComboType.StockItem
cell.DataSource = StockItemCol.Query.LoadDataTable
cell.ValueMember = JCStockItemMetadata.ColumnNames.StockItemID
cell.DisplayMember = "FullName"
End Select
Return cell
End Function
Теперь, когда дело доходит до установки комбинированного источника данных (я использую здесь событие RowEnter, например):
Private Sub dgvStock_RowEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvStock.RowEnter
Try
If IsNumeric(Me.dgvStock.Rows(e.RowIndex).Cells("ID").Value) Then
Dim intValue As Integer = Convert.ToInt32(Me.dgvStock.Rows(e.RowIndex).Cells("Stock Item").Value)
Me.dgvStock.Rows(e.RowIndex).Cells("Stock Item") = GetStockComboDataSource(eStockComboType.StockItem)
Me.dgvStock.Rows(e.RowIndex).Cells("Stock Item").Value = intValue
Else
Me.dgvStock.Rows(e.RowIndex).Cells("Stock Item") = GetStockComboDataSource(eStockComboType.StockIn)
End If
Catch ex As Exception
JCExceptionLogger.LogException(ex)
End Try
End Sub
Здесь я переключаю комбинированный источник данных в зависимости от того, является ли столбец ID числовым, но вы можете реализовать любую бизнес-логику, которая вам требуется. Обратите внимание, что я сохраняю значение ячейки перед установкой комбо (intValue). Это кажется необходимым, иначе комбо будет отображаться как пустое.