-
Имеем DataSet (ordersDataSet), в котором таблицы: Orders --------- OrderID int (pk) ...(ещё какие-то поля) Items --------- OrderID int (pk) ProductID int (pk) ...(ещё какие-то поля) и Relation (Orders_Items), связь по OrderID, у связи стоят артибуты каскадного обновления. Кладём на форму несколько едитов, связываем их с полями таблицы Orders, и DataGrid, привязанный к связи Orders_Items. Что хотим получить: в контролах формы редактируем мастер-запись, а в гриде -- детали. Допустим, обе таблицы заполнены данными, и мы стоим на какой-то мастер-записи. Редактируем поле OrderID и нажимаем кнопоку с таким обработчиком (кнопка "применить"):
private void button1_Click(object sender, System.EventArgs e)
Видим: в детальном гриде строки пропали. Но они никуда не делись, каскадное обновление на самом деле нормально сработало. Это можно увидеть, переместившись по мастер-таблице вперёд-назад, тогда в детальном гриде появятся записи, причём, видно, что у них новое значение OrderID. Собственно, вопрос: в какой бубен постучать, чтобы после изменения ключевого поля (и срабатывания каскадного обновления в DataSet) в детальном гриде отображались строки для нового значения?
-
В какой? Конечно в тот, что перед тобой на столе лежит, с кнопочками. Чем дольше стучать будешь, тем правильней все получится... Решение здесь выложи, пожалуйста.
-
Удалено модератором
-
Какой смысл в редактировании идентификатора (ПК)? 8-()
-
Какой смысл хранить несколько таблиц в одном ДатаСете?
-
> Какой смысл в редактировании идентификатора (ПК)? 8-()
Смысл очень простой -- при работе по disconnected модели обновлять одной транзакцией связанные таблицы.
Пример. Хотим вводить документы а-ля "Накладная". Есть таблицы "Шапка" и "Строки". При этом ключ в "Шапка" -- автоинкремент с шагом -1 (чтоб не пересекаться с ID в базе). Вставляем строку в шапку, связанные строки в детали. При обновлении ID в шапке меняется на ID сгенерированный на сервере, и каскадно меняются ID в связанных деталях. И вставка деталей идёт уже с нужным ID.
Всё это очень красиво (если не учитывать маленькие грабли с отображением ;) ) работает.
> Какой смысл хранить несколько таблиц в одном ДатаСете?
А как вы предлагаете хранить связанные таблицы?
-
> seg (09.11.05 13:01) [4] > Какой смысл хранить несколько таблиц в одном ДатаСете?
Какое завидное упорство! :) Это чтобы похоронить все попытки делфистов создать конкурентноспособные проекты.
> DiamondShark © (09.11.05 15:19) [5]
Я с подобными проблемами не сталкивался, т.к. придерживаюсь стандарта "редактирование - в специальной форме, отображение - в списочной форме". Т.е. я бы накладную "набивал" данными в одной форме (на которой многотабличный датасэт), а потом либо утверждал целиком, либо все отменял.
-
Я понял - ДатаСет в C# - это тоже самое, что DataModule в Delphi, или примерно тоже самое.
-
> seg (10.11.05 11:38) [7] > Я понял - ДатаСет в C# - это тоже самое, что DataModule > в Delphi, или примерно тоже самое.
Слегка похоже. Только DataModule часто используют, как просто модуль программы, на котором удобно собирать в кучу ДатаСэты.
А в VS Датасэт - это именно тематический фрагмент диаграмы базы данных. Причем он не просто прописывается, либо "забрасывается" на форму, но перед этим создается в дизайн-тайме.
Я приводил пример с "редактором Юр.лица". Приведу еще пример для списочной формы. Если нам интересно отобразить в одном списке ряд предприятий, да еще чтобы можно было, как в дереве, просмотреть список сотрудников для каждого предприятия, раскрыв Node, то создаем датасет. В дизайн-тайме это будет выглядеть как схема: "Предприятия" <--- "сотрудники" (один-ко-многим). Естественно - в графическом виде с наименованиями таблиц, полей, связью и прочими атрибутами. После этого "набрасываем" на форму этот датасэт, DtdGrid и указываем последнему на первый. Все. DtdGrid сам найдет связь таблиц внутри датасэта и построит двухступенчатую иерархию данных (создаст DataView для каждой таблицы и свяжет их "мастер-деталь").
-
Получется сетка, как в Инспекторе объектов Делфи? Нажимаешь на крестик и внутри сетки показываются подчиненные записи. Так это было разработано много лет назад.
-
private void button1_Click(object sender, System.EventArgs e)
может так? вроде работает
-
ээ наверное [10] не совсем в кассу, ибо потом с передачей отложенных изменений проблема мягко говоря и ещё смущает то, што если закомментировать код BindingManagerBase bm = BindingContext[ordersDataset, "Orders"]; (bm.Current as DataRowView).EndEdit(); в обработчике применить то ничего не меняется, наверное не в нем дело
-
вот как наверное будет лучше: BindingManagerBase bm = BindingContext[ordersDataset, "Orders"]; bm.SuspendBindings(); bm.ResumeBindings(); к сожалению студии нету на работе, проверяла в дельфае, вроде работает :о)
-
Большое спасибо. Сейчас проверю...
|