1

我在下面有以下代码。效果很好,希望我想让 MaxDemand 为空值。但是由于我正在解析一个字符串,如果我不输入一些值,它似乎会出错。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

实施错误处理解决方案的最佳解决方案是什么?我试过 float.TryParse 但不能让它工作。

感谢您查看我的问题。

    protected void GridView3_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
    float Cost = 0.0F; 
    float Consumption = 0.0F;
    int InvoiceID = 0;
    float MaxDemand = 0.0F;
    DateTime ServiceFrom = new DateTime();
    DateTime ServiceTo = new DateTime();

    foreach (string key in e.NewValues.Keys)
        switch (key)
        {
            case "TotalInvoice": Cost = float.Parse(e.NewValues[key].ToString()); 
                                break;
            case "EnergyInvoiceID": InvoiceID = int.Parse(e.NewValues[key].ToString()); 
                                break;
            case "Consumption": Consumption = float.Parse(e.NewValues[key].ToString()); 
                                break;
            case "ServiceFrom": ServiceFrom = DateTime.Parse(e.NewValues[key].ToString());
                                break;
            case "ServiceTo":   ServiceTo = DateTime.Parse(e.NewValues[key].ToString());
                                break;
            case "MaxDemand": MaxDemand = float.Parse(e.NewValues[key].ToString());
                                break;
        }

    UpdateInvoice(InvoiceID, Cost, Consumption, ServiceFrom, ServiceTo, MaxDemand);
    GridView3.EditIndex = -1;
    PopulateAccountHistory();
}
4

3 回答 3

1

如何使用可空类型并检查 e.NewValues[Key] 不为空

float? MaxDemand;

进而

case "MaxDemand": 
{
   if(e.NewValues[key] != null)
   {
     MaxDemand = float.Parse(e.NewValues[key].ToString());
   }
   break;
}
于 2012-10-18T20:13:06.990 回答
1

这里的问题不在于floatordouble值的实际解析。如果失败,它将返回更具体的异常。看来问题是正在返回的返回之一,e.NewValues[key]null您正在调用ToString

最好null在循环开始时集中检查。它还允许您删除对 的重复调用e.NewValues[key]

 foreach (string key in e.NewValues.Keys) {
   var value = e.NewValues[key];
   if (value == null) { 
       continue;
   }

   var str = value.ToString();
   switch (key) {
     case "TotalInvoice": 
       Cost = float.Parse(str);
       break;

     ...
于 2012-10-18T20:13:40.427 回答
0

从我的NullableExtensions

public static T? Parse<T>(object obj)
    where T : struct
{
    if (obj == null) return null;
    try
    {
        return (T)System.Convert.ChangeType(obj, typeof(T));
    }
    catch (FormatException) { return null; }
    catch (InvalidCastException) { return null; }
}

case "TotalInvoice": Cost = NullableExtensions.Parse<float>(e.NewValues[key]); break;
于 2012-10-18T20:18:18.433 回答