如何刷新绑定MySQL DataAdapter填充DataTable的数据网格
如何刷新绑定类级DataTable的数据网格
你提到的场景我很熟悉——用MySqlDataAdapter填充类级DataTable后,数据库数据被他人更新,需要刷新绑定的DataGridView。你当前尝试Clear()再重新填充的思路是对的,但可能漏掉了关键的绑定刷新步骤,或者细节没处理好。下面给你几种可行的正确实现方式:
方式一:Clear后重新填充+重置数据源
这是最贴近你现有尝试的方案,补全关键步骤即可:
' 先清空DataTable现有数据 MasterDataTable.Clear() ' 重新执行查询并填充DataTable Dim SQLstring As String = "SELECT * FROM Inventory.Metadata" Using cmdSel As New MySqlCommand(SQLstring, MySQLconn.conn) Dim da As New MySqlDataAdapter(cmdSel) da.Fill(MasterDataTable) End Using ' 核心:强制DataGridView读取最新的DataTable数据 ' 先解绑再重新绑定,避免DataGridView未自动检测到数据变化 DataGridView1.DataSource = Nothing DataGridView1.DataSource = MasterDataTable
之所以要重置数据源,是因为有时候DataTable内容更新后,DataGridView不会自动触发刷新,手动解绑再绑定能确保它显示最新数据。
方式二:用Reset()重置DataTable后填充
如果担心Clear()可能带来的绑定残留问题,或者数据库表结构有变动的可能,可以用Reset()彻底重置DataTable再填充:
Dim SQLstring As String = "SELECT * FROM Inventory.Metadata" Using cmdSel As New MySqlCommand(SQLstring, MySQLconn.conn) Dim da As New MySqlDataAdapter(cmdSel) ' 重置DataTable的结构和所有数据,回到初始状态 MasterDataTable.Reset() ' 重新填充数据 da.Fill(MasterDataTable) End Using ' 刷新数据网格绑定 DataGridView1.DataSource = MasterDataTable
Reset()比Clear()更彻底,它会清除所有列定义和数据,适合表结构可能变更的场景。
优化方案:使用BindingSource作为中间层
如果你的DataGridView是通过BindingSource绑定的(这是更推荐的做法),刷新会更高效且不易出问题:
' 初始化时的绑定(放在类级或者初始化方法里) Private bs As New BindingSource() bs.DataSource = MasterDataTable DataGridView1.DataSource = bs ' 刷新数据时的代码 MasterDataTable.Clear() Dim SQLstring As String = "SELECT * FROM Inventory.Metadata" Using cmdSel As New MySqlCommand(SQLstring, MySQLconn.conn) Dim da As New MySqlDataAdapter(cmdSel) da.Fill(MasterDataTable) End Using ' 直接调用BindingSource的重置方法即可,无需解绑绑定 bs.ResetBindings(False)
ResetBindings(False)会通知DataGridView数据源已更新,比重置数据源更流畅,还能保留DataGridView的用户设置(比如列宽、排序状态)。
额外注意点
- 确保你的数据库连接
MySQLconn.conn是处于打开状态且有效的,避免填充时出现连接异常 - 如果在多线程环境下操作,要确保更新DataTable和刷新DataGridView的代码在UI线程执行,否则会引发跨线程错误
内容的提问来源于stack exchange,提问作者TonyW
相关产品推荐
相关产品推荐

