Visual studio 如何使用两个数据源创建组合框列(对于DataGridView)

Visual studio 如何使用两个数据源创建组合框列(对于DataGridView),visual-studio,winforms,datagridview,combobox,Visual Studio,Winforms,Datagridview,Combobox,数据源具有相同的结构,但数据不同。一个用于保存的行(视图模式),另一个用于添加或编辑的行(编辑/新行)。这怎么可能做到呢 我有一个标准的外键列,它引用了一个标准的查找表,该表具有ID、名称和活动(位)。组合框列使用该查找表显示列表,但仅显示活动项。假设使用了一个查找项,然后将其停用(Active=0)。组合框列现在显示错误,因为在列表中找不到ID。有人知道怎么解决吗?不确定你是否还在寻找,但我刚刚遇到了同样的问题。以下是我的地址,希望对你有用 定义一个函数,该函数返回带有适当数据源集的DataG

数据源具有相同的结构,但数据不同。一个用于保存的行(视图模式),另一个用于添加或编辑的行(编辑/新行)。这怎么可能做到呢


我有一个标准的外键列,它引用了一个标准的查找表,该表具有ID、名称和活动(位)。组合框列使用该查找表显示列表,但仅显示活动项。假设使用了一个查找项,然后将其停用(Active=0)。组合框列现在显示错误,因为在列表中找不到ID。有人知道怎么解决吗?

不确定你是否还在寻找,但我刚刚遇到了同样的问题。以下是我的地址,希望对你有用

定义一个函数,该函数返回带有适当数据源集的DataGridViewComboCell(在别处定义的集合对象,请注意,我在本例中使用EntitySpaces填充数据源):

现在,在设置combo数据源时(例如,我在这里使用RowEnter事件):


这里,我根据ID列是否为数字来切换组合数据源,但您可以实现所需的任何业务逻辑。注意,在设置组合(intValue)之前,我保存了单元格的值。这似乎是必要的,否则组合将显示为空白。

这有点帮助,但如何在单元格中显示文本并保存整数值(id)?请查看ValueMember和DisplayMember属性,您可以将它们用于此确切目的。
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
    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