我的代码就是这个
private MyCatch _catch = new MyCatch("Description");
decimal getTotalValue(GridView view, int listSourceRowIndex)
{
decimal unitPrice = Convert.ToDecimal(view.GetListSourceRowCellValue(listSourceRowIndex, "Each")); //Object cannot be cast from DBNull to other types
decimal quantity = Convert.ToDecimal(view.GetListSourceRowCellValue(listSourceRowIndex, "Quantity"));
decimal discount = Convert.ToDecimal(view.GetListSourceRowCellValue(listSourceRowIndex, "TaxPercentage"));
return unitPrice * quantity * (1 - discount);
}
private void gridView1_CustomUnboundColumnData(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDataEventArgs e)
{
GridView view = sender as GridView;
if (e.Column.FieldName == "Totalototal" && e.IsGetData) e.Value =
getTotalValue(view, e.ListSourceRowIndex);
}
答案 0 :(得分:7)
这里我假设,在Null的情况下,它将unitPrice设置为0。
decimal unitPrice = view.GetListSourceRowCellValue(listSourceRowIndex, "Each") == DBNull.Value
? 0
: Convert.ToDecimal(view.GetListSourceRowCellValue(listSourceRowIndex, "Each"));
答案 1 :(得分:2)
如果可以使用null值,请尝试使用可空类型。
decimal? unitPrice = ...
可空类型是一种接受null作为值的值类型。然后,您可以检查值
if (unitPrice.HasValue) // is there a value or null?
unitPrice.Value // do something with the value
更多关于MSDN的无效问题。
但我认为不应该接收null,这会使计算变得不可能。因此,我建议将获取值封装在try/catch
块中,如果某些调用抛出异常,则从方法返回。
答案 2 :(得分:1)
您可以使用TryParse
方法来确定是否可以从给定值转换为十进制或不是。如果无法分配DBNull.Value
语法: decimal.TryParse(value,out parameter)
如果值可以转换为true
,则上述函数返回decimal
无法投射时返回false
当您需要将Null
插入表格列时,您应该从代码中插入DBNull.Value
。
因此,当无法进行投射时,您可以发送DBNull.Value
。
注意:这里我使用了三元?:
运算符将整个事情写成单行
解决方案:
decimal result;
decimal unitPrice =(decimal.TryParse(view.GetListSourceRowCellValue(listSourceRowIndex, "Each"),out result))?result:DBNull.Value;
答案 3 :(得分:1)
问题是因为,从中获取的数据值可能包含DBNull值,这意味着该值不存在。
因此,改变不存在的值的类型是没有意义的。
允许null的解决方案是,将变量声明为可空类型,这意味着它们能够接受空值。
synatax是:
datatype? variablename
跳这有助于..
答案 4 :(得分:0)
我正在使用带有RowDataBound事件的GridView编写ASP.net VB,在某些行中我从数据库中获取空值:
If e.Row.RowType = DataControlRowType.DataRow Then
If (DataBinder.Eval(e.Row.DataItem, "MyField") IsNot DBNull.Value) Then
myTotal += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "MyField"))
End If
End If