我在下面有以下代码。哪个效果很好,我希望允许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();
}
答案 0 :(得分:1)
如何使用可空类型并检查e.NewValues [Key]不为空
float? MaxDemand;
然后
case "MaxDemand":
{
if(e.NewValues[key] != null)
{
MaxDemand = float.Parse(e.NewValues[key].ToString());
}
break;
}
答案 1 :(得分:1)
此处的问题不在于float
或double
值的实际解析中。如果失败则会返回更具体的异常。问题似乎是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;
...
答案 2 :(得分: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;