Ошибка привязки источника при применении фильтра

#vb.net #bindingsource

#vb.net #привязка источника

Вопрос:

Не могу понять, почему я получаю эту ошибку после применения фильтра к источнику привязки.

Система.Исключение InvalidOperationException: «Привязка данных не может найти строку в списке, подходящую для всех привязок».

Я создаю VB.Приложение Net WindowsForms содержит две таблицы:
AptInfo, которая содержит данные, связанные с аэропортом, и
RwyInfo, которая содержит данные, связанные с взлетно-посадочной полосой

Каждая таблица имеет PK, AptID и RwyID, которые являются полями идентификации в SQL. Кроме того, в таблице RwyInfo есть поле FK_AptID, связанное с идентификатором AptID в таблице AptInfo. Я заполняю эти две таблицы в наборе данных и создаю привязку источника для каждой таблицы.

У меня есть различные элементы управления списком, элементы управления текстовым полем и элементы управления датами, которые привязаны к двум объектам BindingSource.

Если я не фильтрую привязку источника для таблицы RwyInfo, я не получаю никаких ошибок, то есть я могу выбрать любую взлетно-посадочную полосу из любого аэропорта, и все элементы управления привязкой к базе данных соответствующим образом обновляются с данными для этой взлетно-посадочной полосы. Проблема возникает, когда я применяю фильтр к источнику привязки для таблицы RwyInfo.

Конечно, я хочу видеть только взлетно-посадочные полосы для текущего аэропорта, а не все взлетно-посадочные полосы для каждого аэропорта.

Я попытался реализовать фильтрацию в событии CurrentItemChanged источника привязки AptInfo:

 Private Sub bsrcAptInfo_CurrentItemChanged(sender As Object, e As EventArgs) Handles bsrcAptInfo.CurrentItemChanged

    Dim oRV As DataRowView
    oRV = bsrcAptInfo.Current

    bsrcRwyInfo.Filter = "FK_AptID = " amp; oRV.Item("AptID").ToString
    Console.WriteLine("Filtered Rows found: " amp; bsrcRwyInfo.Count)

End Sub
  

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

Система.Исключение InvalidOperationException: «Привязка данных не может найти строку в списке, подходящую для всех привязок».

Я подумал, что это может иметь значение, если источником данных для BindingSource будет DataView вместо DataTable, но для меня это не имело никакого значения.

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

Есть идеи, почему я получаю эту ошибку?

С уважением

Комментарии:

1. Вам вообще не нужен какой-либо код для фильтрации дочерней таблицы на основе родительского выбора. Привязка данных может сделать все это за вас, если вы правильно ее настроите. Читать это .

2. @jmcilhinney — ВАУ, этот метод должно быть легче найти, тем не менее, та же ошибка сохраняется. Взлетно-посадочные полосы для первого аэропорта заполняются правильно, но когда я переезжаю в другой аэропорт, все элементы управления привязкой к ВПП не обновляются. Они продолжают показывать данные из первого аэропорта. Когда я пытаюсь выбрать другую взлетно-посадочную полосу, появляется та же ошибка. Система. Исключение InvalidOperationException: «Привязка данных не может найти строку в списке, подходящую для всех привязок». Будет ли эта ошибка результатом наличия родительской записи, у которой еще нет дочерних записей?

3. Похоже, что ваши привязки данных настроены неправильно. Я предлагаю вам очистить все привязки в конструкторе, а затем снова настроить их с нуля. Вы можете протестировать после настройки каждого из них, чтобы, если что-то сломается, вы точно знали, что вызвало это.

4. «Будет ли эта ошибка результатом наличия родительской записи, у которой еще нет дочерних записей» . Я собирался сказать «нет», но потом подумал, проверял ли я когда-либо эту конкретную ситуацию. Я не уверен, что у меня есть, поэтому я сделаю это и свяжусь с вами.

5. Я заметил, что вы говорите, что у вас есть хотя бы один DateTimePicker элемент управления. Как именно вы это связываете? Привязаны ли вы к Value свойству и, если да, обнуляются ли данные в соответствующем столбце? Если ответ «да» в обоих случаях, то это может быть проблемой, потому что по умолчанию нет сопоставления между DBNull.Value и допустимым Date .