我有一个在后台运行的计时器,用于为datagridview对象保持数据更新。我的计时器正在调用sqldatadapter.fill来填充本地范围的数据集。
如果我转到sql server并从我的表中删除一行,我填充数据集的调用并不反映数据库中的这一变化。
如果我在数据库中更新非主键字段的值并且我的计时器运行,则会选择更改并显示在我的datagridview中。
如何设置sqldataadapter以便在其他后端进程添加或删除行时找到它?
这是在form_load
If ds Is Nothing Then
ds = New DataSet()
End If
Try
sqldataadapter = New SqlClient.SqlDataAdapter(SELECTQUERY, parentconnectionstring)
sqldataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
sqlcommandbuilder = New SqlClient.SqlCommandBuilder(sqldataadapter)
sqldataadapter.Fill(ds)
mydata = ds.Tables(0).DefaultView
Catch ex As Exception
ExceptionHandler(ex)
End Try
If mydata.Table.Rows.Count > 0 Then
bindingsource.DataSource = mydata
dgvSystemWeightConfig.DataSource = bindingsource
UpdateLastUpdateTime()
End If
这是我的刷新程序
Public Sub refreshdata()
disableupdatetimer()
Try
If dgvSystemWeightConfig.IsCurrentCellInEditMode Then
Debug.WriteLine("tried to refresh system weight data but user had a cell in edit mode")
Else
Debug.WriteLine("system weight - refreshing data")
sqldataadapter.Fill(ds, mydata.Table.TableName)
dgvSystemWeightConfig.Focus()
UpdateLastUpdateTime()
End If
Catch ex As Exception
ExceptionHandler(ex)
Finally
enableUpdateTimer()
End Try
End Sub
答案 0 :(得分:0)
不要假设SqlDataAdapter没有正确的记录。显然,DataTable实现了INotifyPropertyChanged,但没有实现INotifyCollectionChanged。绑定到ObservableCollection。
调试并计算ds。
我敢打赌,源代码是正确的,UI控件只是没有接受更改。
要获取插入和删除的UI,您需要有一个实现INotifyCollectionChanged的源。
ObservableCollection实现了INotifyCollectionChanged。
DataTable做了很多你需要更换的东西 需要一个类或结构来保存行,并需要定义列 AutoGenerateColumns仅适用于DataTable。