DataGridView, связанный с таблицей MS Access с помощью первичного ключа Autonumber, вызывает ошибки параллелизма - PullRequest
0 голосов
/ 18 января 2020

A имеет систему ввода данных о расписании волонтеров, которая позволяет волонтерам вводить время, которое они потратили на различные виды деятельности. Я использовал VB. net Designer для создания системы (хорошо, теперь я знаю, что это не очень хороший шаг!), Поэтому, пожалуйста, не просите меня показать мой код, большая часть которого генерируется Designer. Моя проблема заключается в следующем: каждой новой записи присваивается отрицательный номер в качестве первичного ключа при вводе, что является способом, которым dgv работает с ключами Access Automumber. Я выполняю следующие операторы в событии RowValidating, когда строка действительна.

   a_dgv.EndEdit()
    a_dgv.CommitEdit(DataGridViewDataErrorContexts.Commit)
    Me.TimeSheets2BindingSource.EndEdit()
    Me.TableAdapterManager.UpdateAll(Me.MembershipDataSet) 

Этот код не обновляет значение первичного ключа в dgv, хотя это происходит в таблице Access. Если пользователь затем пытается удалить или изменить запись, которую он ранее добавил в тот же сеанс, обновление завершается с ошибкой параллелизма. Единственный ответ, если нашли эту проблему, это заполнить всю таблицу. Это явно не желаемое решение. У кого-нибудь есть проверенный проверенный?

Я, наверное, должен упомянуть, что на моем столе есть два комбинированных блока данных с привязкой к данным

1 Ответ

0 голосов
/ 20 января 2020

У меня сложилось впечатление, что сетка данных, являющаяся результатом набора данных из, скажем, Access, не показывает значения PK как -1, -2, -3.

Если вы создали отключенный набор данных ( или дата) в коде из заполнения (извлечение данных из Access), тогда каждая строка обычно не показывает PK.

Однако, независимо от вышеизложенного, при условии, что вы ввели 5 строк, и теперь нужно увидеть Значения PK?

Вы будете во время ввода данных в сетку должны видеть это:

enter image description here

В выше, я добавил две строки , Ваш код сохранения выглядит примерно так:

    tblHotels = DataGridView1.DataSource

    rstDataReader.Update(tblHotels)
    tblHotels.AcceptChanges()

Это отправит данные обратно на SQL сервер (или Access), и затем будут сгенерированы идентификаторы PK с автономным номером. Однако такие изменения НЕ возвращаются в набор данных / данные. Другими словами, идентификаторы PK генерируются в базе данных, но если вы повторно не извлечете данные, вы не увидите значения PK.

Вам придется повторно извлекать данные. Однако вы можете сохранить текущую позицию сетки и повторно заполнить данные следующим образом:

    rstDataReader.Update(tblHotels)
    tblHotels.AcceptChanges()
    Dim MyTop As Integer = DataGridView1.FirstDisplayedScrollingRowIndex
    tblHotels.Clear()
    rstDataReader.Fill(tblHotels)
    DataGridView1.FirstDisplayedScrollingRowIndex = MyTop

И тогда вы должны увидеть это:

enter image description here

Другим способом было бы отправить + обновить каждую строку при редактировании данных, а затем вытащить PK, но очевидно, что вы не сможете обновить все изменения сетки с помощью кнопки SAVE, и таким образом, конечно, нет способности un-do.

Я считаю, что вышеизложенное положение верхней части сетки не мерцает. С другой стороны, я полагаю, что это может / будет зависеть от того, насколько велик набор данных (но опять же, загрузка сетки со слишком большим количеством строк не является идеальной).

Итак, насколько я Можно сказать, что вы должны повторно вытащить набор данных / datatable, чтобы получить новые сгенерированные идентификаторы PK, или вы должны сохранить + pull для каждой редактируемой строки. Для сетки с несколькими сотнями строк я не вижу мерцания с приведенным выше кодом.

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