Есть главная талбица (предположим список сотрудников) есть подчиненная ей таблица (протокол их прихода на работу), и ещё одна подчиненная таблица (суммы отработаных часов, переработок, больничных), т.е. агрегированная информация из первой подчиненной таблицы. Изменяю в первой подчиненной форме время проведенное сотрудником на работе, нажимаю обновить, а во второй ничего не меняется, по крайней мере на гриде. Это конечно вполне логично, но как сделать так, что б менялось, желательно не выполняя LoadDataset? Потому что когда выполняется load сбиваются текущие строки в гридах. Вопрос тростейший, просто интересно как это принято делать ПРАВИЛЬНО.
Здравствуйте, 3axapov, Вы писали:
3>ЕИзменяю в первой подчиненной форме время проведенное сотрудником на работе, нажимаю обновить, а во второй ничего не меняется, по крайней мере на гриде. Это конечно вполне логично,
какая же здесь логика ? если в dataset меняется содержимое второй подчиненной таблицы (а оно меняется ?), то должно быть синхронное отображение всех изменений в grid'e
если отображаешь в разных гридах, установи datasource у них один и тот же (dataset), с разными datamember'ами (именами таблиц)
Здравствуйте, SCS, Вы писали:
SCS>какая же здесь логика ? если в dataset меняется содержимое второй подчиненной таблицы (а оно меняется ?), то должно быть синхронное отображение всех изменений в grid'e
Нет, не меняется, пока не сделать Load.
SCS>если отображаешь в разных гридах, установи datasource у них один и тот же (dataset), с разными datamember'ами (именами таблиц)
Отображаю в разных гридах, все так и сделано.
Хочется узнать, как загрузить таблицу, что б выбранная строчка в гриде не менялась.
Здравствуйте, 3axapov, Вы писали:
3>Нет, не меняется, пока не сделать Load.
т.е. записи вставляются сначала в БД (триггер ?), а потом их надо подгрузить во вторую подчиненную таблицу, да так чтобы текущее положение Position не менялось ?
отключаешь EnforceConstraint, делаешь Fill, включаешь EnforceConstraint (чтобы нормаально сработало должен быть PK) или через merge
Спасибо, я так уже пытался, но из-за первичных ключей не выходило.
А что бы обновления в базу происходили сразу после перехода на другую строку — только вызывать каждый раз Update? это не слишком ресурсоемко? И ещё, где лучше расположить код обрабатывающий OnPowCanged?
Здравствуйте, 3axapov, Вы писали:
3>Спасибо, я так уже пытался, но из-за первичных ключей не выходило.
3>А что бы обновления в базу происходили сразу после перехода на другую строку — только вызывать каждый раз Update? это не слишком ресурсоемко? И ещё, где лучше расположить код обрабатывающий OnPowCanged?
Столкнулся с аналогичной проблемой.
Правильно ли я понял, что ты использешь вычисляемое поле у которого в свойстве Expression стоит выражение, содержащее агрегатную функцию?
Я попробовал сделать так:
два грида отображают две таблицы master/detail (dataset содержит эти две таблицы и объект ralation);
в главной таблице есть вычисляемое поле содержащее агрегатную функцию, суммирующую значения из подчиненной таблицы;
если значение в подчиненной таблице меняется, то в гриде показывающем главную таблицу значение вычисляемого поля не обновляется пока не перейдешь в главном гриде на другую строку (в подчиненном гриде можно хоть все записи поменять, а главный, зараза, сам не обновляется пока в него не ткнешь и не перейдешь на другую строку).
Видимо нужно в каком-то из событий связанных с изменением данных подчиненной таблицы поставить вызов Refresh() для грида отображающего связанные данные. Но где именно?
По идее можно получить через BindingContext источник данных для подчиненного грида, и задать обработчик события ListChanged (а в нем как раз и вызывать СвязанныйGrid.Refresh() ). Однако, это не слишком удобно, так как источником данных для подчиненного грида является DataView, который динамически генерируется каждый раз, когда в главном гриде переходишь на другую строку (т.е. само прикрепление обработчика события к такому DataView так просто не выполнишь).
Наверное должен быть более правильный способ .
Кто знает другой (правильный) способ, помогите, please.
Здравствуйте, Lmdrv, Вы писали:
L>По идее можно получить через BindingContext источник данных для подчиненного грида, и задать обработчик события ListChanged (а в нем как раз и вызывать СвязанныйGrid.Refresh() ). Однако, это не слишком удобно, так как источником данных для подчиненного грида является DataView, который динамически генерируется каждый раз, когда в главном гриде переходишь на другую строку (т.е. само прикрепление обработчика события к такому DataView так просто не выполнишь).
вариант "наоборот"
попробуй поставить событие на первоисточник, а refresh'ить основной binding