#vb.net
#vb.net
Вопрос:
vb.Net 4.6.1 — Приложение Windows Forms
Я пытаюсь внести некоторые изменения в datatable в форме, и у меня возникают некоторые проблемы. Я получил функциональность, которая отлично работает в тестовой форме, но я не могу разобраться с проблемой в моей большой форме.
Предположим, у меня есть Windows form со списком, который показывает список идентификаторов и одно текстовое поле, содержащее подробную информацию об идентификаторе. Свойство detail.text привязано к адаптеру данных. Моя проблема в том, что когда я изменяю текст в текстовом поле, а затем проверяю getchanges, я не вижу никаких изменений.
Я поместил кнопку в форму, чтобы проверять значения datatable по запросу, и они меняются, но по какой-то причине изменения не обнаружены.
- Загрузите форму, выберите идентификатор в выпадающем списке, и подробная информация будет загружена в текстовое поле.
-
Нажмите кнопку и увидите исходное значение:
Окно сообщения.Показать(DsSIngleJob.apGetSingleJob.Элемент (0).подробно)
Окно сообщения.Показать(DsSIngleJob.apGetSingleJob.Rows(0).Item(«подробно»)) -
Измените текст в текстовом поле.
- Нажмите кнопку, и в окнах сообщений отобразится новое значение.
-
Проверьте изменения, и они не найдены:
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
вызывается. TBC5. И это событие, и этот вызов метода будут происходить неявно при определенной навигации, но также могут быть принудительными. Вызов
Validate
принудительно вызовет событие, а вызовEndEdit
наBindingSource
вызоветEndEdit
наDataRowView
. Если вы вызываетеEndEdit
неявно или явно до того, какValidated
событие вызвано явно или неявно, вы не увидите новые данные вDataRow
.