通过bindingsource绑定到datagridview的数据表

时间:2013-10-21 20:12:37

标签: vb.net winforms datagridview datatable bindingsource

我在Windows窗体上有一个datagridview。我有一个在运行时创建的bindingsource和datatable,我打算用它来绑定并保持我的datagridview更新。

调试时,我看到我的数据表正在填充行。当你打开可视化工具时,我也可以看到我的bindingsource数据源有数据。

我的问题是我的datagridview保持空白,似乎从来没有得到我的数据表和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

和我的updatedatagridview例程

 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

2 个答案:

答案 0 :(得分: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

如果这样做,那么按照步骤应用你的逻辑。

答案 1 :(得分:0)

这个问题的解决方案是多部分的。

我必须像Carlos Landeras所指出的那样将datagridview的数据源分配给bindingsource对象(而不是bindingsource.datasource)。

除此之外,我不得不打电话:

 bindingsource.ResetBindings(False)
    DataGridView.Refresh()