1

我有包含几行的数据表,如下所示

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 的值为零,但我需要在运行时添加具有不同表达式的动态列,如何避免此类错误任何想法请帮助。

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

4

3 回答 3

1

您可以捕获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)
于 2013-02-15T10:04:17.393 回答
1

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

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

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

Dim currentExpression as String = BuildCurrentExpression() 
col = New DataColumn("VCH1", GetType(Decimal), currentExpression)
于 2013-02-15T10:14:49.853 回答
0

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

<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
于 2013-02-15T11:53:18.567 回答