Обработка обновлений деталей в представлении Master-Detail в Winform C #

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

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

Нижняя форма принимает источник привязки и использует связь (между двумя таблицами) для своего собственного члена источника данных.

Просмотр данных отлично работает.

Когда я обновляю данные в мастере, я фиксирую их, когда пользователь выходит из записи. Я использую bindingsource.EndEdit (), DataSet.HasChanges () для проверки, а затем tableadapter.update для записи данных перед переходом к следующей записи.

Это тоже отлично работает.

Теперь, как мне записать и записать данные в подробной (внизу) форме? все, что у него есть, - это переданный источник привязки.

У меня есть частично работающее решение, где верхняя форма фактически использует второй оператор tableadapter.update для записи дочерней таблицы ... но, похоже, для этого требуется 2 перехода по записям. (в этот момент данные действительно обновляются правильно)

Есть ли более эффективные способы работы со всем этим на высоком уровне? спасибо R


person da Bich    schedule 08.02.2015    source источник
comment
похоже, что запись попадает в верхнюю форму, как только я перехожу к следующей записи - ЕСЛИ я изменяю записи в нижней форме после внесения изменения. Но если я останусь на измененной записи и перейду к следующей в верхней форме, то это будет задержано. Я запускаю EndEdit при проверке строки gridview ... может быть, мне также следует сделать это, когда нижняя форма теряет фокус?   -  person da Bich    schedule 09.02.2015
comment
на самом деле ... это также ловится, если я остаюсь на отредактированной записи в нижнем подробном виде сетки, но затем нажимаю на другое поле в верхней форме, прежде чем перейти к следующей записи в верхней форме. Таким образом, проблема возникает только тогда, когда я перехожу от отредактированной нижней записи и сразу же нажимаю кнопку перехода к следующей записи. Похоже на тайминг?   -  person da Bich    schedule 09.02.2015
comment
Кажется, я подтверждаю, что порядок событий не такой, как я ожидал ... Когда пользователь нажимает кнопку из нижней формы, я пробовал много разных событий, чтобы попытаться вызвать EndEdit на его источнике привязки. Однако кажется, что каждое событие вызывается только ПОСЛЕ события, на которое щелкнули в верхней форме (т.е. перемещение записей), где я проверяю HasChanges и т. Д. Я пробовал следующие события в нижнем апплете: RowValidating on сетка, оставьте в нижней форме и CellEndEdit в сетке. Удивительно, но ни один из них не вызывается до ПОСЛЕ события, на которое щелкнули из верхнего апплета!   -  person da Bich    schedule 09.02.2015


Ответы (1)


Похоже, это была либо общая проблема с порядком событий ... или, может быть, она специфична для привязки навигатора или моей настройки ... но для того, чтобы события нижней формы срабатывали ДО того, как запись будет изменена в верхнем апплете (при нажатии непосредственно из измененная строка сетки внизу, к навигатору), мне пришлось сначала явно переместить фокус в этом верхнем событии апплета. В моем случае я поймал любой щелчок на навигаторе и просто запустил this.focus (); это привело к срабатыванию всех событий нижней формы, прежде чем продолжить. Это позволило моей проверке haschanges () в верхней форме произойти после bindingsource.endedit в нижней форме.

person da Bich    schedule 09.02.2015