You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()方法返回当前选中的正确数据对象,避免更新错误记录。

更新前后截图:

  • 更新前:before update Capture1
  • 更新后:AFTER UPDATE Capture2

内容的提问来源于stack exchange,提问作者user22579796

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:22:16