Родительский DataGridView не обновляется при использовании иерархического обновления TableAdapterManager - PullRequest
2 голосов
/ 20 января 2012

Вот факты:

  1. У меня есть родительская таблица, назовем ее Order. Данные в этой таблице просматриваются с использованием DataGridView (dgvOrder).
  2. У меня есть дочерняя таблица, назовем ее OrderDetails. Данные в этой таблице просматриваются с использованием DataGridView (dgvOrderDetails)
  3. У меня есть текстовые поля (и флажки, выпадающие списки и т. Д.), Привязанные к таблице заказа (с помощью BindingSource).
  4. Я использую Visual Studio 2008.

Что я хочу сделать:

dgvOrder только для чтения. Я использую это для просмотра записей аля BindingNavigator. (Мне нравится использовать DataGridView для навигации по записям, потому что он интуитивно понятен. Вы сразу видите, что представляют собой следующие несколько записей.)

Чтобы добавить новые записи, я использую «новую» кнопку (uxNewButton). Чтобы сохранить свои обновления, я использую кнопку «Сохранить» (uxSaveButton). Записи добавляются с использованием текстовых полей, а не напрямую через dgvOrder. Дочерние записи добавляются напрямую через dgvOrderDetails.

dgvOrderDetails, я думаю, довольно очевиден - он содержит детали Ордена (отношение 1 ко многим).

Мой код и конфигурация:

  • Иерархическое обновление (в конструкторе набора данных) имеет значение true (по умолчанию в VS 2008)
  • Отношение между Order и OrderDetail установлено как "и отношение, и ограничение fk". Обновление и удаление установлены в каскад. Правило принятия / отклонения установлено на «нет». Вложенное отношение не проверено.
  • TableAdapterManager перетаскивается в конструктор (там).

    private void uxNewButton_Click (отправитель объекта, EventArgs e) {

        bsOrder.AddNew();
    

    }

    private void uxSaveButton_Click (отправитель объекта, EventArgs e) {

        this.Validate();
        bsOrder.EndEdit();
        bsOrderDetails.EndEdit();
    
        tam.UpdateAll(dsOrder); //DataSet is named dsOrder. try-catch block excluded for simplicity
    

    }

Проблема:

После заполнения всех текстовых полей (и т. Д.) И dgvOrderDetails нажатие кнопки сохранения приведет к ошибке: ForeignKeyConsraint FK_Orderchild_Order требует наличия значений родительского ключа (-1) в родительской таблице.

Однако, если я добавлю запись напрямую, используя dgvOrder (тогда dgvOrderDetails), нажатие кнопки сохранения сохранит успешно.

Я также обнаружил, что могу успешно сохранить, если я добавляю новые записи, используя текстовые поля, но должен выбрать другую строку в dgvOrder, затем выбрать текущую строку снова, прежде чем добавлять записи в dgvOrderDetails.

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

Я пробовал различные хаки в событии сохранения, например:

dgvOrder.Refresh(); //or

dgvOrder.Invalidate();
dgvOrder.Refresh(); // or

dgvOrder.Parent = null;
Controls.Add(dgvOrder);

//and so on and so forth (suggetstions from Google searches)

1 Ответ

0 голосов
/ 15 мая 2013

Добавление bsOrder.EndEdit () к событию ввода dgvOrderDetail, похоже, решает проблему, но я не уверен, что это лучший метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...