Положение:
В моей базе данных есть таблица, в которой записи могут ссылаться на другие записи в той же таблице. Каждая запись имеет уникальный числовой идентификатор (столбец автоидентификации) и обнуляемый столбец IDRef
, который может содержать идентификатор записи, на которую следует ссылаться.
Теперь в моем приложении C # Windows Forms я использую DataGridView, чтобы позволить пользователю редактировать записи в таблице. Он может добавлять, редактировать или удалять элементы. У меня есть типизированный DataSet для хранения данных и соответствующий TableAdapter для загрузки данных из базы данных и выполнения обновлений. DataGridView связан с BindingSource, который использует типизированный DataSet в качестве источника данных.
Для столбца IDRef
я добавил ComboBox-столбец, который заполняет его значения из того же BindingSource, что и сам DataGridView. Это означает, что ComboBox всегда соответствует количеству записей.
Проблема:
Я отображаю столбец ID
в DataGridView. При добавлении новых строк путем щелчка по соответствующей строке DataGridView значение идентификатора автоматически заполняется отрицательными значениями. Окончательное значение автоматического идентификатора вычисляется только после сохранения изменений в базе данных с помощью TableAdapter.
Теперь, когда я раскрываю ComboBox для столбца IDRef
, я могу выбрать ранее существующие записи (например, 101, 102 и т. Д.), Но я также могу выбрать записи, которые были добавлены после последнего обновления в база данных (например, -1, -2, -3).
Теперь: после того, как я использую метод TableAdapter Update
для сохранения изменений в базе данных, эти отрицательные идентификаторы больше не существуют - я ссылаюсь на несуществующие записи (в моем случае это приводит к ошибке ограничения внешнего ключа ).
Решение
То, что я сделал, это:
- Использовать второй DataSet и BindingSource для столбца ComboBox
- Добавить кнопку «Применить», которая обновляет изменения в базе данных с помощью TableAdapter
- Перечитать данные во второй DataSet, привязанный к столбцу ComboBox
Это гарантирует, что пользователь может выбрать только те значения, которые были сохранены в базе данных, нажав кнопку «Применить».
Есть ли более элегантный способ обработки таких "собственных ссылок" в таблицах с использованием элемента управления DataGridView?
РЕДАКТИРОВАТЬ: Изменены теги, чтобы лучше соответствовать теме