VB.NET中DataGridView绑定源刷新异常问题排查
代码存在的问题及修复方案
1. 语法错误(导致逻辑执行异常)
BtnUpdate_Click方法中存在无对应If的ElseIf,且Using conn代码块不完整,会导致代码逻辑无法正确执行,甚至抛出编译/运行时错误。
修复:补全If判断,用Using块完整包裹数据库操作代码,确保连接正确释放。
2. 数据库更新逻辑的潜在风险
- 两次更新操作(
StockProduct和ProductOut)未用事务包裹,若其中一次更新失败,会导致数据不一致。 - 更新
StockProduct的SQL中,@Param1和@Param2均传入product.Qty,需确认该逻辑是否匹配业务需求(比如是否是本次新增的数量差值)。
修复:添加事务,确保两个更新操作原子性(要么都成功,要么都回滚)。
3. DataGridView刷新失效的核心原因
loaddata方法每次都新建BindingSource并重新赋值给DataGridView1.DataSource,易因UI线程同步问题导致显示异常;更规范的做法是复用已有BindingSource,仅更新其数据源。BtnUpdate_Click中先修改内存对象的Qty并调用DataGridView1.Refresh(),此时数据库未更新,后续执行数据库更新和loaddata时,内存数据与数据库数据的短暂不一致可能干扰UI刷新。
修复后的关键代码示例
修复loaddata方法(复用BindingSource)
Private Sub loaddata() Using conn = New OleDbConnection(connectionString) conn.Open() ' 直接查询为List,避免类型转换 resultList = conn.Query(Of ProductOut)("SELECT p.ProductId, p.ProductName,p.Price,p.Qty,s.QtyStock FROM ProductOut p INNER JOIN StockProduct s ON s.ProductId = p.ProductId").ToList() ' 复用已有的BindingSource,无需每次新建 If bindingSource1 Is Nothing Then bindingSource1 = New BindingSource() DataGridView1.DataSource = bindingSource1 End If ' 更新数据源,触发UI自动刷新 bindingSource1.DataSource = New BindingList(Of ProductOut)(resultList) End Using End Sub
修复BtnUpdate_Click方法(补全语法+事务)
Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles BtnUpdate.Click Dim product = GetProduct() ' 补全If判断逻辑 If product IsNot Nothing Then Dim addQty = CInt(NumericUpDownQTY.Value) Dim newQty = product.Qty + addQty Using conn = New OleDbConnection(connectionString) conn.Open() ' 开启事务保证更新原子性 Using trans = conn.BeginTransaction() Try ' 更新StockProduct Dim count2 As Integer = conn.Execute("UPDATE StockProduct INNER JOIN ProductOut On (StockProduct.ProductId = ProductOut.ProductId) Set StockProduct.QtyStock = (StockProduct.QtyStock-(@Param1-ProductOut.Qty)), StockProduct.QtyOut = (StockProduct.QtyOut+(@Param2-ProductOut.Qty)) WHERE ProductOut.Productid = @PARAM3;", New With { Key .param1 = newQty, Key .param2 = newQty, Key .param3 = product.ProductId}, transaction:=trans) ' 更新ProductOut Dim count As Integer = conn.Execute("UPDATE ProductOut SET Qty = @param1 WHERE ProductId = @param2", New With { Key .param1 = newQty, Key .param2 = product.ProductId}, transaction:=trans) trans.Commit() MessageBox.Show("更新成功") ' 重新加载数据刷新UI loaddata() Catch ex As Exception trans.Rollback() MessageBox.Show(ex.Message, "POS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try End Using End Using End If End Sub
其他注意事项
- 移除
loaddata中多余的conn.Close(),Using块会自动关闭并释放连接。 - 统一变量命名大小写(如
BindingSource1和bindingSource1统一为bindingSource1),避免混淆。 - 确保
GetProduct()方法返回当前选中的正确数据对象,避免更新错误记录。
更新前后截图:
- 更新前:

- 更新后:

内容的提问来源于stack exchange,提问作者user22579796
相关产品推荐
相关产品推荐

