DataTable Column.Expression抛出错误

时间:2013-02-15 09:55:32

标签: vb.net winforms datatable

我的数据表包含少量行,如下所示

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

表达式值未修复,用户为动态列创建表达式。 不仅处理除零错误,还要处理所有类型的计算错误

3 个答案:

答案 0 :(得分:1)

Expression语法允许使用IIF语句
您可以使用Expression

的这种语法构建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)

答案 1 :(得分:0)

您可以捕获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)

答案 2 :(得分: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