VB.NET中首次加载Form2时DataGridView无数据问题排查
VB.NET Form2首次打开DataGridView无数据,再次打开正常的问题排查
问题现象
- 首次触发Enter按键打开Form2时,DataGridView未显示任何记录
- 关闭Form2后再次触发Enter按键打开,DataGridView可正常显示记录
相关代码
Private Sub GetItemData(ByVal iditem As String) Dim Item = iService.GetByCodeProductOrBarcode(iditem) If Item IsNot Nothing Then If String.Equals(iditem, Item.Barcode, StringComparison.CurrentCultureIgnoreCase) Then BtxtBarcode.Text = Item.Barcode ElseIf String.Equals(iditem, Item.CodeProduct, StringComparison.CurrentCultureIgnoreCase) Then BtxtBarcode.Text = Item.CodeProduct End If Btxtcodeproduct.Text = Item.CodeProduct Else End If End Sub Private Sub BtxtBarcode_KeyPress(sender As Object, e As KeyPressEventArgs) _ Handles BtxtBarcode.KeyPress If e.KeyChar = Convert.ToChar(Keys.Enter) Then AddEntry() End If End Sub Private Sub AddEntry() If String.IsNullOrWhiteSpace(BtxtBarcode.Text) Then MsgBox("Please enter item barcode or product code...") Return End If Dim productCode = Btxtcodeproduct.Text.Trim() Dim _BBarcode = BtxtBarcode.Text.Trim() If (_BBarcode.Length <= 11) Then GetItemData(_BBarcode) Using frm = New Form2(productCode) If frm.ShowDialog() = DialogResult.OK Then Dim row As DataRow = Nothing If _myTable.Rows.Cast(Of DataRow).Any() Then row = If(_myTable. Select($"Barcode = '{_BBarcode}'"). FirstOrDefault(), _myTable. Select($"Codeproduct = '{productCode}'"). FirstOrDefault()) End If If row IsNot Nothing Then Dim qty = If(row("Qty") Is DBNull.Value, 0, row.Field(Of Integer)("Qty")) row.SetField("Qty", qty + 1) Return Else '...etc. End If Try Dim service = New Itemservice2() Dim stock = service.Getitem2(productCode).FirstOrDefault() If stock Is Nothing Then MessageBox.Show("Unknown product!") Return End If For Each row2 As DataGridViewRow In frm.DataGridView1.Rows Dim isselect As Boolean = Convert.ToBoolean(row2.Cells("checkboxcolumn").Value) If isselect Then _myTable.Rows.Add(_myTable.Rows.Count + 1, frm.DataGridView1.CurrentRow.Cells(2).Value.ToString, _BBarcode, frm.DataGridView1.CurrentRow.Cells(3).Value, 1) BtxtBarcode.Clear() Btxtcodeproduct.Clear() End If Next Catch ex As Exception MessageBox.Show(ex.Message) End Try End If End Using ElseIf _BBarcode.Length >= 12 Then 'etc End Sub
问题根源
核心问题出在AddEntry方法的变量执行顺序:
- 首次执行时,
productCode在调用GetItemData之前就从Btxtcodeproduct.Text取值,此时文本框还未被赋值,productCode为空字符串 - 空值传入Form2构造函数,导致Form2无法查询到对应数据,DataGridView无记录显示
- 第二次执行时,
Btxtcodeproduct.Text已被第一次的GetItemData赋值,productCode能拿到有效数据,Form2正常加载记录
修复方案
将productCode的获取逻辑移到GetItemData调用之后,确保拿到最新的赋值结果:
Private Sub AddEntry() If String.IsNullOrWhiteSpace(BtxtBarcode.Text) Then MsgBox("Please enter item barcode or product code...") Return End If Dim _BBarcode = BtxtBarcode.Text.Trim() If (_BBarcode.Length <= 11) Then GetItemData(_BBarcode) ' 移到GetItemData之后,获取赋值后的productCode Dim productCode = Btxtcodeproduct.Text.Trim() Using frm = New Form2(productCode) ' 后续原有逻辑保持不变 If frm.ShowDialog() = DialogResult.OK Then Dim row As DataRow = Nothing If _myTable.Rows.Cast(Of DataRow).Any() Then row = If(_myTable. Select($"Barcode = '{_BBarcode}'"). FirstOrDefault(), _myTable. Select($"Codeproduct = '{productCode}'"). FirstOrDefault()) End If If row IsNot Nothing Then Dim qty = If(row("Qty") Is DBNull.Value, 0, row.Field(Of Integer)("Qty")) row.SetField("Qty", qty + 1) Return Else '...etc. End If Try Dim service = New Itemservice2() Dim stock = service.Getitem2(productCode).FirstOrDefault() If stock Is Nothing Then MessageBox.Show("Unknown product!") Return End If For Each row2 As DataGridViewRow In frm.DataGridView1.Rows Dim isselect As Boolean = Convert.ToBoolean(row2.Cells("checkboxcolumn").Value) If isselect Then _myTable.Rows.Add(_myTable.Rows.Count + 1, frm.DataGridView1.CurrentRow.Cells(2).Value.ToString, _BBarcode, frm.DataGridView1.CurrentRow.Cells(3).Value, 1) BtxtBarcode.Clear() Btxtcodeproduct.Clear() End If Next Catch ex As Exception MessageBox.Show(ex.Message) End Try End If End Using ElseIf _BBarcode.Length >= 12 Then 'etc End If End Sub
额外检查点
- 确认Form2的构造函数能正确处理传入的
productCode,空值时给出提示或不执行数据查询 - 验证
GetItemData方法中iService.GetByCodeProductOrBarcode(iditem)确实返回有效数据,且正确赋值给Btxtcodeproduct.Text
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

