VB.NET中TextBox数据添加至DataGridView:同条码去重及数量累加异常排查
问题排查与修复
核心问题分析
你的代码存在三个关键问题,导致Qty无法正确累加:
- 硬编码累加值:每次找到重复条码时,你直接设置
DataGridView1.Rows(j).Cells(4).Value = Qty + 1,但Qty始终被初始化为1,所以不管重复多少次,结果都是1+1=2,没有读取当前单元格的现有数量进行累加。 - 数据源与界面不同步:修改DataGridView单元格值后,没有更新绑定的数据源
itemtransfers中的对应对象属性,这会导致数据状态不一致;同时只有新增行时才调用Bind,修改操作未同步数据源。 - 遍历范围错误:
For j = 0 To Me.DataGridView1.Rows.Count - 1会遍历到DataGridView的空行(默认允许新增行时最后一行是空行),可能引发空值转换错误。
修正后的代码
Private Sub BtxtBarcode_KeyPress(sender As Object, e As KeyPressEventArgs) Handles BtxtBarcode.KeyPress Try If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) Then If String.IsNullOrEmpty(BtxtBarcode.Text) Then MsgBox("Please enter item barcode.", MsgBoxStyle.Information, "Information") Return End If GetItemData(BtxtBarcode.Text) Dim targetBarcode = BtxtBarcode.Text.Trim() Dim existingItem = itemtransfers.FirstOrDefault(Function(it) it.Barcode = targetBarcode) If existingItem IsNot Nothing Then ' 找到重复条码,累加数量 existingItem.Qty += 1 DataGridView1.Refresh() ' 刷新界面显示最新数据 Else ' 新增条目 Dim iRow As Integer = If(itemtransfers.Count = 0, 1, itemtransfers.Max(Function(it) it.No) + 1) itemtransfers.Add(New ItemTransfers With { .No = iRow, .CodeProduct = _CodeProduct, .Barcode = _BBarcode, .Qty = 1 }) DataGridView1.Bind(itemtransfers) End If BtxtBarcode.Clear() End If Catch ex As Exception MessageBox.Show(ex.Message, "POS", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try End Sub
修正说明
- 直接操作数据源:通过LINQ的
FirstOrDefault直接从绑定的itemtransfers集合中查找重复条码的对象,修改其Qty属性后刷新界面,保证数据源和界面数据一致。 - 正确累加逻辑:
existingItem.Qty += 1直接基于现有数量进行累加,解决了硬编码值的问题。 - 简化行号生成:通过集合的
Max方法获取最大行号,避免操作DataGridView的行索引,逻辑更可靠。 - 空值判断优化:用
String.IsNullOrEmpty替代空字符串比较,判断更严谨。
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

