我有一个Windows表单应用,DataGridView
填充了TableAdapter
。我正在使用Fill
方法更新循环Async
子网中的UI数据,如此。
Private Async Sub updateUI()
Dim sw As New Stopwatch
While True
Await Task.Delay(3000)
sw.Restart()
myTableAdapter.Fill(getDataWithMySQL())
'myTableAdapter.Fill(myDataSet.myTable)
logger.Debug(sw.ElapsedMilliseconds)
End While
End Sub
getDataWithMySQL
功能如下:
Private Function getDataWithMySQL() As myDataSet.myDataTable
Dim connStr As String = My.Settings.myConnectionString
Dim sql As String = "SELECT ... LEFT JOIN ..."
Dim dt As New myDataSet.myDataTable
Using conn As New MySqlConnection(connStr)
Using cmd As New MySqlCommand()
With cmd
.CommandText = sql
.Connection = conn
End With
Try
conn.Open()
Dim sqladapter As New MySqlDataAdapter(cmd)
sqladapter.Fill(dt)
Catch ex As MySqlException
MsgBox(ex.Message)
End Try
End Using
End Using
Return dt
End Function
myTableAdapter.Fill(myDataSet.myTable)
效果很好,但效果不佳,而myTableAdapter.Fill(getDataWithMySQL())
表现得更好,正如我尚未回答的问题here所报告的那样。
由于某种原因,myTableAdapter.Fill(getDataWithMySQL())
不再起作用。它不会抛出错误,dt
会填充正确的数据,但DataGridView
没有更新。它以前工作过,我不认为我改变了会影响这一点的任何事情。有关DataGridView
没有更新的任何想法吗?
答案 0 :(得分:1)
我相信您的问题源于您在方法调用中创建新数据表并返回该数据表的事实。您已经获得了所需的DataSet.DataTable引用,只需使用该DataTable调用Fill。
您的问题是,您正在填充的数据表与您的网格正在使用的数据集没有关联。
答案 1 :(得分:1)
这很可能是因为.Fill
命令使用ByRef
获取数据表。我想发生的事情是你正在使用getDataWithMySQL()
返回一个DataTable,但是你正在使用该DataTable并使用适配器的.Fill
方法和你返回的DataTable重新填充它。 getDataWithMySQL()
方法进入lala land再也不会被看到了。
在这里做一些假设,但试着尝试一下:
Private Async Sub updateUI()
Dim sw As New Stopwatch
While True
Await Task.Delay(3000)
sw.Restart()
Dim dt as myDataSet.myDataTable = getDataWithMySQL("SELECT ... LEFT JOIN ...")
UpdateDGV(dt)
'myTableAdapter.Fill(myDataSet.myTable)
logger.Debug(sw.ElapsedMilliseconds)
End While
End Sub
' You need to change `DataGridView` here to be the actual datagridview control on the form
Private Sub UpdateDGV(newSource as myDataSet.myDataTable)
DataGridView.SuspendLayout()
DataGridView.DataSource = Nothing
DataGridView.DataSource = newSource
DataDridView.ResumeLayout()
End Sub
' Make the function easier to reuse by passing in the SQL command
Private Function getDataWithMySQL(sqlCmd as string) As myDataSet.myDataTable
Dim connStr As String = My.Settings.myConnectionString
Dim dt As New myDataSet.myDataTable
Using conn As New MySqlConnection(connStr)
Using cmd As New MySqlCommand()
With cmd
.CommandText = sqlCmd
.Connection = conn
End With
Try
conn.Open()
Dim sqladapter As New MySqlDataAdapter(cmd)
sqladapter.Fill(dt)
Catch ex As MySqlException
MsgBox(ex.Message)
End Try
End Using
End Using
Return dt
End Function