Конференция ".Net" » Data binding, master-detail...
 
  • DiamondShark © (18.09.05 21:56) [0]
    Имеем 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)
    {
       BindingManagerBase bm = BindingContext[ordersDataset, "Orders"];
       (bm.Current as DataRowView).EndEdit();
    }



    Видим: в детальном гриде строки пропали. Но они никуда не делись, каскадное обновление на самом деле нормально сработало. Это можно увидеть, переместившись по мастер-таблице вперёд-назад, тогда в детальном гриде появятся записи, причём, видно, что у них новое значение OrderID.

    Собственно, вопрос: в какой бубен постучать, чтобы после изменения ключевого поля (и срабатывания каскадного обновления в DataSet) в детальном гриде отображались строки для нового значения?
  • Saruwatari © (08.11.05 14:07) [1]
    В какой? Конечно в тот, что перед тобой на столе лежит, с кнопочками. Чем дольше стучать будешь, тем правильней все получится...
    Решение здесь выложи, пожалуйста.
  • seg (08.11.05 16:03) [2]
    Удалено модератором
  • Курдль © (09.11.05 12:37) [3]
    Какой смысл в редактировании идентификатора (ПК)? 8-()
  • seg (09.11.05 13:01) [4]
    Какой смысл хранить несколько таблиц в одном ДатаСете?
  • DiamondShark © (09.11.05 15:19) [5]

    > Какой смысл в редактировании идентификатора (ПК)? 8-()

    Смысл очень простой -- при работе по disconnected модели обновлять одной транзакцией связанные таблицы.

    Пример.
    Хотим вводить документы а-ля "Накладная".
    Есть таблицы "Шапка" и "Строки".
    При этом ключ в "Шапка" -- автоинкремент с шагом -1 (чтоб не пересекаться с ID в базе). Вставляем строку в шапку, связанные строки в детали.
    При обновлении ID в шапке меняется на ID сгенерированный на сервере, и каскадно меняются ID в связанных деталях. И вставка деталей идёт уже с нужным ID.

    Всё это очень красиво (если не учитывать маленькие грабли с отображением ;) ) работает.


    > Какой смысл хранить несколько таблиц в одном ДатаСете?

    А как вы предлагаете хранить связанные таблицы?
  • Курдль © (09.11.05 15:30) [6]

    > seg   (09.11.05 13:01) [4]
    > Какой смысл хранить несколько таблиц в одном ДатаСете?


    Какое завидное упорство! :)
    Это чтобы похоронить все попытки делфистов создать конкурентноспособные проекты.


    > DiamondShark ©   (09.11.05 15:19) [5]

    Я с подобными проблемами не сталкивался, т.к. придерживаюсь стандарта "редактирование - в специальной форме, отображение - в списочной форме".
    Т.е. я бы накладную "набивал" данными в одной форме (на которой многотабличный датасэт), а потом либо утверждал целиком, либо все отменял.
  • seg (10.11.05 11:38) [7]
    Я понял - ДатаСет в C# - это тоже самое, что DataModule в Delphi, или примерно тоже самое.
  • Курдль © (11.11.05 11:27) [8]

    > seg   (10.11.05 11:38) [7]
    > Я понял - ДатаСет в C# - это тоже самое, что DataModule
    > в Delphi, или примерно тоже самое.


    Слегка похоже. Только DataModule часто используют, как просто модуль программы, на котором удобно собирать в кучу ДатаСэты.

    А в VS Датасэт - это именно тематический фрагмент диаграмы базы данных. Причем он не просто прописывается, либо "забрасывается" на форму, но перед этим создается в дизайн-тайме.

    Я приводил пример с "редактором Юр.лица". Приведу еще пример для списочной формы.
    Если нам интересно отобразить в одном списке ряд предприятий, да еще чтобы можно было, как в дереве, просмотреть список сотрудников для каждого предприятия, раскрыв Node, то создаем датасет.
    В дизайн-тайме это будет выглядеть как схема: "Предприятия" <--- "сотрудники" (один-ко-многим). Естественно - в графическом виде с наименованиями таблиц, полей, связью и прочими атрибутами.
    После этого "набрасываем" на форму этот датасэт, DtdGrid и указываем последнему на первый.
    Все. DtdGrid сам найдет связь таблиц внутри датасэта и построит двухступенчатую иерархию данных (создаст DataView для каждой таблицы и свяжет их "мастер-деталь").
  • seg (11.11.05 14:13) [9]
    Получется сетка, как в Инспекторе объектов Делфи?
    Нажимаешь на крестик и внутри сетки показываются подчиненные записи.
    Так это было разработано много лет назад.
  • k2 © (12.11.05 18:42) [10]
    private void button1_Click(object sender, System.EventArgs e)
    {
      ordersDataset.AcceptChanges();
     //BindingManagerBase bm = BindingContext[dataSet1, "Orders"];
     //(bm.Current as DataRowView).EndEdit();
    }


    может так? вроде работает
  • k2 © (14.11.05 07:12) [11]
    ээ наверное [10] не совсем в кассу, ибо потом с передачей отложенных изменений проблема мягко говоря
    и ещё смущает то, што если закомментировать код
    BindingManagerBase bm = BindingContext[ordersDataset, "Orders"];
    (bm.Current as DataRowView).EndEdit();
    в обработчике применить то ничего не меняется, наверное не в нем дело
  • k2 © (14.11.05 09:28) [12]
    вот как наверное будет лучше:


    BindingManagerBase bm = BindingContext[ordersDataset, "Orders"];
    bm.SuspendBindings();
    bm.ResumeBindings();

    к сожалению студии нету на работе, проверяла в дельфае, вроде работает :о)
  • DiamondShark © (14.11.05 16:58) [13]
    Большое спасибо.
    Сейчас проверю...
 
Конференция ".Net" » Data binding, master-detail...
Есть новые Нет новых   [134430   +2][b:0][p:0.001]