【问题标题】:DataTable Column.Expression Throw ErrorDataTable Column.Expression 抛出错误
【发布时间】:2013-01-31 06:33:56
【问题描述】:

我有一个包含如下几行的数据表

CH1 CH2 Ch3 CH4 CH5
1   2   1   2   3
3   3   1   2   3
3   3   1   1   2
1   3   3   3   3
1   2   3   3   0
3   3   1   2   0
3   3   1   1   2

然后我尝试添加新列

Dim col As New DataColumn("VCH1", GetType(Decimal),"(CH1+CH2+ch3)/CH5")
DtReadings.Columns.Add(col)

当时给我错误:试图除以零。因为 CH5 的值为零, 但我需要在运行时添加具有不同表达式的动态列,如何避免此类错误任何想法请帮助。

表达式值不固定,用户为动态列创建表达式。 不仅可以处理除以零错误,还可以处理所有类型的计算错误

【问题讨论】:

  • 那么当你除以零时你想发生什么?
  • 这是 C# 还是 VB 问题?
  • VB ,而不是零或空
  • 你可以检查一下CH5,如果它是null或0,把它换成1,会有帮助吗?所以在 0 或 null 的情况下,它将除以 1 留下列的值 = 列的总和
  • 任意列都为零,表达式不固定,如“(CH1+CH2)/(CH3-CH4)”

标签: vb.net winforms datatable


【解决方案1】:

只需创建一个扩展来解决我的问题,这需要一些时间,但我没有问题

<Extension()>
Public Function ToCompute(value As DataTable, exp As String, inputColumn As String) As DataTable
    Dim tempdt As New DataTable
    tempdt = value.Clone
    tempdt.Columns(inputColumn).Expression = exp
    For Each row As DataRow In value.Rows.Cast(Of DataRow).ToList
        Try
            tempdt.Rows.Add(row.ItemArray)
            value.Rows(value.Rows.IndexOf(row))(inputColumn) = tempdt.Rows(0)(inputColumn).ToString
            tempdt.Rows.Clear()
        Catch ex As Exception
            tempdt.Rows.Clear()
            value.Rows(value.Rows.IndexOf(row))(inputColumn) = 0
            Continue For
        End Try
    Next
    Return value
End Function

【讨论】:

    【解决方案2】:

    Expression 语法允许使用 IIF 语句
    您可以使用表达式的这种语法构建您的 DataColumn

    col = New DataColumn("VCH1", GetType(Decimal), "IIF(CH5 = 0, 0, (CH1+CH2+ch3)/CH5)")
    

    当然,作为一个字符串属性的表达式,您可以根据当前的特定要求动态构建表达式。使用 IIF 或 ISNULL,您可以在添加列之前动态构建字符串。类似这样的伪代码

    Dim currentExpression as String = BuildCurrentExpression() 
    col = New DataColumn("VCH1", GetType(Decimal), currentExpression)
    

    【讨论】:

    • 表达式会稍微复杂一些,因为 OP 说公式是动态的。
    • 我的问题是表达式是动态的,这是 (CH1+CH2+ch3)/CH5 之一,例如
    • 我想到了先生。史蒂夫,但希望 OP 得到它:D
    【解决方案3】:

    您可以捕获DivideByZeroException,然后分配您想要的值:

    Try
        col = New DataColumn("VCH1", GetType(Decimal), "(CH1+CH2+ch3)/CH5")
    Catch ex As DivideByZeroException
        col = New DataColumn("VCH1", GetType(Decimal), "0")
    End Try
    
    DtReadings.Columns.Add(col)
    

    【讨论】:

    • 不确定这是否可行。首先,我认为异常将在添加时间而不是在构建列时引发,其次零值仅在某些行中,您尝试为整个列添加默认值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2011-12-27
    相关资源
    最近更新 更多