DataTable.GetChanges () работает не так, как ожидалось

#vb.net

#vb.net

Вопрос:

vb.Net 4.6.1 — Приложение Windows Forms

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

Предположим, у меня есть Windows form со списком, который показывает список идентификаторов и одно текстовое поле, содержащее подробную информацию об идентификаторе. Свойство detail.text привязано к адаптеру данных. Моя проблема в том, что когда я изменяю текст в текстовом поле, а затем проверяю getchanges, я не вижу никаких изменений.

Я поместил кнопку в форму, чтобы проверять значения datatable по запросу, и они меняются, но по какой-то причине изменения не обнаружены.

  1. Загрузите форму, выберите идентификатор в выпадающем списке, и подробная информация будет загружена в текстовое поле.
  2. Нажмите кнопку и увидите исходное значение:

    Окно сообщения.Показать(DsSIngleJob.apGetSingleJob.Элемент (0).подробно)
    Окно сообщения.Показать(DsSIngleJob.apGetSingleJob.Rows(0).Item(«подробно»))

  3. Измените текст в текстовом поле.

  4. Нажмите кнопку, и в окнах сообщений отобразится новое значение.
  5. Проверьте изменения, и они не найдены:

    ApGetSingleJobBindingSource.EndEdit()

    Затемнить JobChanges как DataTable = Новый DataTable

    JobChanges = Me.DsSIngleJob.apGetSingleJob.GetChanges

    Окно сообщения.Показать(JobChanges.Rows.Подсчитайте.toString)

Если вместо изменения текста в форме я запишу его непосредственно в datatable перед завершением редактирования, то изменения будут приняты:

  DsSIngleJob.apGetSingleJob.Rows(0).Item("detail") = "NewValue"
  

Поскольку у меня это работает над тестовой формой, должно быть, какая-то проблема с основной формой или связанным адаптером данных, но я возился с этим весь день и не могу заставить его работать. Если у кого-нибудь есть что-то, что стоит проверить, это было бы здорово. Я проверил форму на наличие каких-либо applychanges или загрузок после изменения текстового поля вручную, но я ничего не нашел.

Комментарии:

1. Сначала вызовите Validate метод form, затем вызовите EndEdit метод BindingSource. Я почти уверен, что в прошлом я обнаружил, что это принудительно фиксировало ожидающие изменения.

2. Кстати, почему вы создаете новую DataTable и присваиваете ее JobChanges переменной, а затем сразу отбрасываете ее, когда присваиваете результат GetChanges этой же переменной? Почему делать Dim JobChanges As DataTable = New DataTable и JobChanges = Me.DsSIngleJob.apGetSingleJob.GetChanges вместо Dim JobChanges As DataTable = Me.DsSIngleJob.apGetSingleJob.GetChanges ? Не создавайте новые объекты, если вы на самом деле не собираетесь их использовать.

3. Мне не нужно вызывать Validate в моей тестовой форме, и это работает нормально. Я попробую, но, похоже, если это потребуется, мне придется сделать это и в моей рабочей модели. Спасибо.

4. Если у вас есть данные, привязанные к элементу управления WinForms, то есть Binding объект, управляющий потоком этих данных. У этого Binding есть DataSourceUpdateMode свойство, для которого по умолчанию установлено значение OnValidation , но его можно изменить на OnPropertyChanged или Never . Предполагая, что в вашем случае это значение по умолчанию, я полагаю, что ситуация такова, что данные будут перенесены из элемента управления в границу, DataRowView когда элемент управления вызывает свое Validated событие, и из DataRowView в DataRow когда EndEdit вызывается. TBC

5. И это событие, и этот вызов метода будут происходить неявно при определенной навигации, но также могут быть принудительными. Вызов Validate принудительно вызовет событие, а вызов EndEdit на BindingSource вызовет EndEdit на DataRowView . Если вы вызываете EndEdit неявно или явно до того, как Validated событие вызвано явно или неявно, вы не увидите новые данные в DataRow .