datatable привязан к datagridview через bindingsource

У меня есть datagridview в форме Windows. У меня есть источник привязки и таблица данных, которые создаются во время выполнения, которые я собираюсь использовать для привязки и обновления моего datagridview.

При отладке я вижу, что моя таблица данных заполняется строками. Когда вы открываете визуализатор, я также вижу, что в источнике данных моего источника привязки есть данные.

Моя проблема в том, что мой datagridview остается пустым и, кажется, никогда не получает никаких данных, которые получают мои datatable и bindingsource.

Пример кода:

 Private bs1 As New BindingSource
 Private TraysToScanDatatable As New DataTable

в моем конструкторе

TraysToScanDatatable.Columns.Add(New DataColumn("time", GetType(DateTime)))
TraysToScanDatatable.Columns.Add(New DataColumn("scanner", GetType(Integer)))
TraysToScanDatatable.Columns.Add(New DataColumn("traynumber", GetType(Integer)))
bs1.DataSource = TraysToScanDatatable
UpdateDataGridView(TraysToReadDataGridView, bs1.DataSource) 'if I do not set my datagridview with a delegate here then I cannot update the binding source in the timer.

обновить логику таймера

  TraysToScanDatatable.Rows.Add(New Object() {DateTime.Now, 1, lastScanner1TrayReceived})
  Me.bs1.DataSource = TraysToScanDatatable
  me.bs1.MoveLast

и моя обновленная подпрограмма

 Public Sub UpdateDataGridView(ByVal control As DataGridView, ByVal newdata As DataTable)
    If Not control.InvokeRequired Then
        control.DataSource = newdata
    Else
        Invoke(New Action(Of DataGridView, DataTable)(AddressOf UpdateDataGridView), control, newdata)
    End If
End Sub

person TWood    schedule 21.10.2013    source источник


Ответы (2)


Вы должны назначить сам объект BindingSource datagridView.Datasource, а не BindingSource.Datasource.

Эта ваша строка:

If Not control.InvokeRequired Then
    control.DataSource = newdata
Else

назначает bs1.DataSource источнику данных сетки вместо BindingSource object

Попробуйте сделать это так:

datagridview.DataSource = bs1
bs1.Datasource = TraysToScanDatatable

И если это сработает, примените свою логику, следуя шагам.

person Carlos Landeras    schedule 21.10.2013
comment
Я изменил код, как вы предлагали, но когда я запускаю его, я получаю те же результаты. Что еще нужно проверить? - person TWood; 22.10.2013
comment
Проверяли ли вы во время отладки, что TraysToScanDatatable имеет какую-либо строку, когда вы назначаете ее bs1.Datasource ?. Также используйте datagridview.AutogenerateColumns = true перед привязкой - person Carlos Landeras; 22.10.2013
comment
TraysToScanDatatable содержит данные до назначения bs1.datasource. Я также использую autogenerate = true. Спасибо за вашу помощь. Из всего, что я прочитал в руководствах, это все, что мне нужно сделать, чтобы эта работа заработала. - person TWood; 22.10.2013

Решение этой проблемы было многократным.

Мне пришлось назначить источник данных datagridview объекту bindingsource (вместо bindingsource.datasource), как указал Карлос Ландерас.

В дополнение к этому пришлось позвонить:

 bindingsource.ResetBindings(False)
    DataGridView.Refresh()
person TWood    schedule 12.11.2013