我在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
答案 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()