1

以下のコードがあります。MaxDemand を null 値にできるようにしたいと考えています。しかし、文字列を解析しているので、値を入れないとエラーになるようです。

例外の詳細: 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

null 許容型を使用して、e.NewValues[Key] が null ではないことを確認するのはどうですか

float? MaxDemand;

その後

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

ここでの問題は、floatまたはdouble値の実際の解析にはありません。それが失敗した場合、より具体的な例外が返されます。問題は、の戻り値の 1 つであり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 に答える