【问题标题】:How to make a ComboBox column with two data sources (for DataGridView)如何制作具有两个数据源的 ComboBox 列(用于 DataGridView)
【发布时间】:2010-09-18 12:38:45
【问题描述】:

数据源结构相同,但数据不同。一种用于保存的行(查看模式),另一种用于正在添加或编辑的行(编辑/新行)。怎么实现?

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

【问题讨论】:

    标签: visual-studio winforms datagridview combobox


    【解决方案1】:

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

    定义一个函数,该函数返回带有适当数据源集的 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)之前保存了单元格的值。这似乎是必要的,否则组合将显示为空白。

    【讨论】:

    • 这有点帮助,但是如何在单元格中显示文本并在 DataSource 中保存整数值 (id)?
    • 查看 ValueMember 和 DisplayMember 属性,您可以将它们用于此目的。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多