C #: Как обрабатывать «собственные ссылки» для таблиц в DataGridView? - PullRequest
3 голосов
/ 09 июня 2009

Положение:

В моей базе данных есть таблица, в которой записи могут ссылаться на другие записи в той же таблице. Каждая запись имеет уникальный числовой идентификатор (столбец автоидентификации) и обнуляемый столбец 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?

РЕДАКТИРОВАТЬ: Изменены теги, чтобы лучше соответствовать теме

Ответы [ 2 ]

1 голос
/ 09 июня 2009

При использовании двух разных таблиц проблема отрицательного идентификатора решается с помощью отношения, отредактируйте его свойства и установите для него внешний ключ с каскадными обновлениями.

Я бы ожидал, что это сработает и для самореференции, но это сложно.

В отдельном примечании, я думаю, у вас должен быть другой BindingSource (для той же таблицы) для комбинированного списка (или связывание без BindingSource)

Обратите внимание, что у вас есть и другие доступные инструменты, например Adapter.Update (dataRow)

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