Две подчиненные таблицы
От: 3axapov  
Дата: 03.04.03 13:49
Оценка:
Есть главная талбица (предположим список сотрудников) есть подчиненная ей таблица (протокол их прихода на работу), и ещё одна подчиненная таблица (суммы отработаных часов, переработок, больничных), т.е. агрегированная информация из первой подчиненной таблицы. Изменяю в первой подчиненной форме время проведенное сотрудником на работе, нажимаю обновить, а во второй ничего не меняется, по крайней мере на гриде. Это конечно вполне логично, но как сделать так, что б менялось, желательно не выполняя LoadDataset? Потому что когда выполняется load сбиваются текущие строки в гридах. Вопрос тростейший, просто интересно как это принято делать ПРАВИЛЬНО.
Re: Две подчиненные таблицы
От: SCS  
Дата: 03.04.03 14:31
Оценка:
Здравствуйте, 3axapov, Вы писали:

3>ЕИзменяю в первой подчиненной форме время проведенное сотрудником на работе, нажимаю обновить, а во второй ничего не меняется, по крайней мере на гриде. Это конечно вполне логично,


какая же здесь логика ? если в dataset меняется содержимое второй подчиненной таблицы (а оно меняется ?), то должно быть синхронное отображение всех изменений в grid'e
если отображаешь в разных гридах, установи datasource у них один и тот же (dataset), с разными datamember'ами (именами таблиц)
SCS
Re[2]: Две подчиненные таблицы
От: 3axapov  
Дата: 04.04.03 05:20
Оценка:
Здравствуйте, SCS, Вы писали:

SCS>какая же здесь логика ? если в dataset меняется содержимое второй подчиненной таблицы (а оно меняется ?), то должно быть синхронное отображение всех изменений в grid'e


Нет, не меняется, пока не сделать Load.

SCS>если отображаешь в разных гридах, установи datasource у них один и тот же (dataset), с разными datamember'ами (именами таблиц)


Отображаю в разных гридах, все так и сделано.

Хочется узнать, как загрузить таблицу, что б выбранная строчка в гриде не менялась.

Спасибо, SCS.
Re[3]: Две подчиненные таблицы
От: SCS  
Дата: 04.04.03 06:26
Оценка: 2 (1)
Здравствуйте, 3axapov, Вы писали:

3>Нет, не меняется, пока не сделать Load.


т.е. записи вставляются сначала в БД (триггер ?), а потом их надо подгрузить во вторую подчиненную таблицу, да так чтобы текущее положение Position не менялось ?

отключаешь EnforceConstraint, делаешь Fill, включаешь EnforceConstraint (чтобы нормаально сработало должен быть PK) или через merge
SCS
Re[4]: Две подчиненные таблицы
От: 3axapov  
Дата: 04.04.03 08:43
Оценка:
Спасибо, я так уже пытался, но из-за первичных ключей не выходило.

А что бы обновления в базу происходили сразу после перехода на другую строку — только вызывать каждый раз Update? это не слишком ресурсоемко? И ещё, где лучше расположить код обрабатывающий OnPowCanged?
Re[5]: Две подчиненные таблицы
От: Lmdrv Россия  
Дата: 04.04.03 12:00
Оценка:
Здравствуйте, 3axapov, Вы писали:

3>Спасибо, я так уже пытался, но из-за первичных ключей не выходило.


3>А что бы обновления в базу происходили сразу после перехода на другую строку — только вызывать каждый раз Update? это не слишком ресурсоемко? И ещё, где лучше расположить код обрабатывающий OnPowCanged?


Столкнулся с аналогичной проблемой.
Правильно ли я понял, что ты использешь вычисляемое поле у которого в свойстве Expression стоит выражение, содержащее агрегатную функцию?
Я попробовал сделать так:
два грида отображают две таблицы master/detail (dataset содержит эти две таблицы и объект ralation);
в главной таблице есть вычисляемое поле содержащее агрегатную функцию, суммирующую значения из подчиненной таблицы;
если значение в подчиненной таблице меняется, то в гриде показывающем главную таблицу значение вычисляемого поля не обновляется пока не перейдешь в главном гриде на другую строку (в подчиненном гриде можно хоть все записи поменять, а главный, зараза, сам не обновляется пока в него не ткнешь и не перейдешь на другую строку).

Видимо нужно в каком-то из событий связанных с изменением данных подчиненной таблицы поставить вызов Refresh() для грида отображающего связанные данные. Но где именно?
По идее можно получить через BindingContext источник данных для подчиненного грида, и задать обработчик события ListChanged (а в нем как раз и вызывать СвязанныйGrid.Refresh() ). Однако, это не слишком удобно, так как источником данных для подчиненного грида является DataView, который динамически генерируется каждый раз, когда в главном гриде переходишь на другую строку (т.е. само прикрепление обработчика события к такому DataView так просто не выполнишь).
Наверное должен быть более правильный способ .

Кто знает другой (правильный) способ, помогите, please.
... << RSDN@Home 1.0 beta 6a >>
Re[6]: Две подчиненные таблицы
От: SCS  
Дата: 04.04.03 13:25
Оценка:
Здравствуйте, Lmdrv, Вы писали:

L>По идее можно получить через BindingContext источник данных для подчиненного грида, и задать обработчик события ListChanged (а в нем как раз и вызывать СвязанныйGrid.Refresh() ). Однако, это не слишком удобно, так как источником данных для подчиненного грида является DataView, который динамически генерируется каждый раз, когда в главном гриде переходишь на другую строку (т.е. само прикрепление обработчика события к такому DataView так просто не выполнишь).


вариант "наоборот"
попробуй поставить событие на первоисточник, а refresh'ить основной binding

this.ds.Tables["second"].RowChanged+=new DataRowChangeEventHandler(OnRowChanged);
this.ds.Tables["second"].RowDeleted+=new DataRowChangeEventHandler(OnRowChanged);
...            
private void OnRowChanged( object sender, DataRowChangeEventArgs e )
{ ((CurrencyManager)(this.dataGrid1.BindingContext[this.dataGrid1.DataSource, this.dataGrid1.DataMember])).Refresh();
}
SCS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.