C# подробное представление таблицы данных winforms не отвечает при добавлении новой родительской записи - PullRequest
0 голосов
/ 29 апреля 2020

С использованием Visual Studio 2019 и sql Сервер 12

Я реализовал взаимосвязь основных деталей в winforms. Родительская запись отображается в форме, а дочерние записи для этой родительской строки отображаются в виде таблицы данных. Все работает хорошо, пока я просматриваю существующие записи. Однако, когда я добавляю новую родительскую запись, дочернее представление данных все еще застревает в последней просмотренной родительской (сохраненной) записи. Новая запись имеет временный идентификатор -1. Я использую автоматически сгенерированный идентификатор в БД. У БД есть ограничение внешнего ключа. Когда я добавил детальную таблицу в набор данных, появилась связь, но ограничения нет. Я тестировал с и без ограничений, но в поведении не было никаких изменений.

Я читал, что другие сообщили, что они не смогли сохранить подробные записи из-за временного идентификатора. Для меня, когда я добавляю новую дочернюю строку, она связывается с другой родительской записью, а не с новой родительской записью.

Между ResearchActivities и Contacts существует связь между многими. Эти три таблицы включают ResearchActivities, Contacts и ResearchActivitiesContacts. Я отношусь к ResearchActivity как к родителю, а ResearchActivitiesContacts - как к ребенку. Совместное использование некоторого кода: отношение fk c = новый глобальный :: System.Data.ForeignKeyConstraint ("FK__ResearchActvityContacts__ResearchActivity", новый глобальный :: System.Data.DataColumn [] {this.tableResearchActivity.ResearchActivityIDColumn}, новый global :: System.Data.DataColumn [] {this.tableResearchActivityContacts.ResearchActivityIDColumn}); this.tableResearchActivityContacts.Constraints.Add (FK c); fk c .AcceptRejectRule = global :: System.Data.AcceptRejectRule.None; fk c .DeleteRule = global :: System.Data.Rule.None; fk c .UpdateRule = global :: System.Data.Rule.Cascade;

источник привязки для дочернего элемента this.researchActivityContactsBindingSource.DataMember = "FK__ResearchActvityContacts__ResearchActivity"; this.researchActivityContactsBindingSource.DataSource = this.researchActivityBindingSource;

        this.researchActivityBindingNavigator.BindingSource = this.researchActivityBindingSource;
        this.researchActivityContactsBindingNavigator1.BindingSource = this.researchActivityContactsBindingSource;

1 Ответ

0 голосов
/ 29 апреля 2020

Ваш bindingNavigator должен быть связан с вашим ParentBindingSource, а ваш childBindingSource - с дочерним членом вашего ParentBindingSource.

Предположим, у вас есть две таблицы: Customers (Parent) в качестве CustomersBindingSource и Contacts (Child) в качестве contactsBindingSource. Таким образом, у Контактов есть внешний ключ клиента, с которым они связаны.

Так что ContactsBindingSource должен быть связан с CustomersBindingSource. Что-то вроде:

this.contactsBindingSource.DataSource = this.customersBindingSource;
this.contactsBindingSource.DataMember = "CustomersContacts";

Оттуда все дочерние элементы (контакты) связаны с родителями (клиентами).

Надеюсь, что это помогает, поскольку мы действительно не знаем, как вы реализовали это отношение , Как сказал Йерун ван Ланген, было бы полезно поделиться частями вашего кода, показывающими, как вы реализуете это отношение.

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