无法将对象从DBNull强制转换为显示的其他类型错误?

时间:2013-11-22 12:15:25

标签: c# winforms devexpress

我的代码就是这个

    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);
    }

5 个答案:

答案 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