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

解决DGV字符串转Decimal错误及DGV2库存值同步至DGV1的问题

问题描述

我有两个DataGridView(简称DGV):

  • DGV1为绑定型控件,加载Access数据库中包含7400余条物料的“parts”表;
  • DGV2为非绑定型控件,加载该数据库导出的.csv文件,用于物料库存管理,包含“Old stock”“New stock”“Difference”列。

需求是将DGV2“New stock”列的新值写入DGV1的“Old stock”列,但当DGV2某一行未填写“New stock”值时,会触发错误提示:Invalid conversion from string to decimal type。现有VB.NET代码如下:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Validate()
    Me.TEILEBindingSource.EndEdit()

    Dim row As TeileDataSet.TEILERow

    For i = 0 To Me.DataGridView2.Rows.Count - 1
        Dim dgvrow As DataGridViewRow = Me.DataGridView2.Rows(i)
        If (dgvrow IsNot Nothing) AndAlso (Not dgvrow.IsNewRow) Then
            'The PrimaryKey for this table is the LotId field
            row = TeileDataSet.TEILE.FindByID(dgvrow.Cells("IDTeileNR").Value)
            If row IsNot Nothing Then
                row("Old stock") = CDec(dgvrow.Cells("New stock").Value) ' <---- 报错位置
            End If
        End If
    Next

End Sub
报错原因

当DGV2的“New stock”单元格未填写值时,单元格返回的内容是空字符串或DBNull.Value,直接用CDec()进行强制类型转换,会因输入值不符合十进制格式要求触发转换异常。

解决方案

使用Decimal.TryParse方法做安全转换,先验证值的有效性,再执行赋值操作。同时可根据业务逻辑,对未填写的行选择跳过或设置默认值(比如0)。修改后的代码如下:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Validate()
    Me.TEILEBindingSource.EndEdit()

    Dim row As TeileDataSet.TEILERow
    Dim newStockValue As Decimal

    For i = 0 To Me.DataGridView2.Rows.Count - 1
        Dim dgvrow As DataGridViewRow = Me.DataGridView2.Rows(i)
        If (dgvrow IsNot Nothing) AndAlso (Not dgvrow.IsNewRow) Then
            ' 获取主键值并查找对应行
            row = TeileDataSet.TEILE.FindByID(dgvrow.Cells("IDTeileNR").Value)
            If row IsNot Nothing Then
                ' 先尝试转换New stock的值
                Dim cellValue As Object = dgvrow.Cells("New stock").Value
                ' 处理空值或无效值的情况
                If cellValue IsNot DBNull.Value AndAlso Decimal.TryParse(cellValue.ToString(), newStockValue) Then
                    row("Old stock") = newStockValue
                Else
                    ' 可选:未填写或值无效时的处理逻辑,比如设为0或跳过
                    ' row("Old stock") = 0
                    ' 或者直接跳过该行
                    Continue For
                End If
            End If
        End If
    Next

End Sub

关键修改点

  • 新增newStockValue变量存储转换后的十进制值;
  • 先判断单元格值是否为DBNull.Value,再用Decimal.TryParse验证并转换;
  • 增加了无效值的分支处理,可根据业务需求选择设置默认值或跳过该行。

内容的提问来源于stack exchange,提问作者andi-n

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:52:40