Выполните код после того, как все родительские / дочерние привязки данных будут загружены - PullRequest
0 голосов
/ 24 марта 2020

У меня есть форма с 3 DataGridView элементами управления, каждый с BindingSource, привязанным к таблице DataSet, связанной с базой данных Access. Один из BindingSource элементов управления является родительским элементом управления, а два других связаны с помощью отношения (в базе данных Access и VS DataSet) с родительским элементом управления. Первоначальная настройка была сделана с помощью простого перетаскивания в форму, и все это прекрасно работает. Когда я изменяю текущую запись для родительского элемента управления сеткой, меняются и две другие.

Я хотел бы запустить код, который использовал информацию во всех 3 таблицах / сетках, поэтому мне нужно иметь возможность обнаруживать когда все таблицы закончились изменяться при изменении текущей записи родительского элемента BindingSource.

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

Некоторые исследования показывают, что, возможно, мне нужно будет использовать BindingManagerBase концепция, о которой я ничего не знаю, но я не уверен в этом. Может быть, есть способ заставить дочерние элементы управления BindingSource загрузить новые дочерние данные, чтобы я мог обработать результаты в родительском событии _CurrentChanged?

Пожалуйста, по крайней мере, просто дайте мне несколько советов? Я не прошу законченный код, просто какое-то направление, пока я изучаю некоторые базовые c концепции, которые мне еще предстоит выучить.

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

1 Ответ

2 голосов
/ 24 марта 2020

Во-первых, нет необходимости или смысла использовать класс BindingManagerBase. Раньше вам приходилось использовать свойство BindingContext элемента управления, чтобы получить объект CurrencyManager для управления определенными аспектами привязки данных. CurrencyManager наследует BindingManagerBase. Класс BindingSource существует, так что вам не нужно этого делать, и он также включает в себя некоторые другие функции связывания.

Что касается вопроса, то не существует простого способа сделать это. Тебе нужно немного поковыряться. Вам нужно использовать тот факт, что при выборе новой родительской записи дочерний элемент BindingSource вызовет событие ListChanged с ListChangedType, равным Reset. У вас двое детей BindingSources, поэтому вам нужно подождать, пока оба не вызовут это событие. Вопросы усложняются тем фактом, что эти события также будут вызываться во время установки привязки, поэтому вы должны игнорировать эти события. Нечто подобное должно сработать:

Private isLoaded As Boolean = False
Private childrenResetCount As Integer = 0

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Set up binding here.

    isLoaded = True
End Sub

Private Sub BindingSources_ListChanged(sender As Object, e As ListChangedEventArgs) Handles BindingSource1.ListChanged,
                                                                                            BindingSource2.ListChanged
    If isLoaded AndAlso e.ListChangedType = ListChangedType.Reset Then
        childrenResetCount += 1

        If childrenResetCount = 2 Then
            'Use child data here.

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