Как сделать столбец ComboBox с двумя источниками данных (для DataGridView) - PullRequest
0 голосов
/ 22 октября 2008

Источники данных имеют одинаковую структуру, но разные данные. Один будет использоваться для сохраненных строк (режим просмотра), а другой - для строк, которые добавляются или редактируются (редактирование / новые строки). Как это может быть достигнуто?

У меня есть стандартный столбец внешнего ключа, который ссылается на стандартную таблицу поиска, которая имеет идентификатор, имя и активный (бит). Столбец поля со списком использует эту справочную таблицу для отображения списка, но только активные элементы. Допустим, элемент поиска используется, а затем деактивируется (Active = 0). Столбец поля со списком теперь показывает ошибки, потому что идентификатор не найден в списке. У кого-нибудь есть идеи как это решить?

1 Ответ

1 голос
/ 30 ноября 2008

Не уверен, что вы все еще ищете, но я только что столкнулся с той же проблемой. Вот как я к этому обратился, надеюсь, он вам пригодится.

Определите функцию, которая возвращает 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). Это кажется необходимым, иначе комбо будет отображаться как пустое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...