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

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方法的变量执行顺序:

  1. 首次执行时,productCode在调用GetItemData之前就从Btxtcodeproduct.Text取值,此时文本框还未被赋值,productCode为空字符串
  2. 空值传入Form2构造函数,导致Form2无法查询到对应数据,DataGridView无记录显示
  3. 第二次执行时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:25:32