【问题标题】:How to handle an exception "Specified cast is not valid"如何处理异常“指定的强制转换无效”
【发布时间】:2015-10-09 14:50:06
【问题描述】:

我用 Infragistics 制作了一个 UltraGrid,其中有一列 Datetime 类型的列,格式为 HH:mm。

通常,该列会填充一个值,例如:“15:13”。我可以编辑它并设置我想要的然后保存。但是如果我删除它看起来像这样的字段:“_ : _”然后我保存我的表,我会得到一个异常“指定的转换无效”。

这是因为我试图保存一个未设置的值。我想知道如何处理这个异常。

我试图将该字段与“null”进行比较,但它不起作用。

var newDuration = (DateTime)row.GetCellValue(3);
if (newDuration == null)
{
      MessageBox.Show("Please set all the fields.");
}

该列的dataType为System.DateTime,我将默认值设置为DB(DBNull),AllowDBNull为Default。

有两种方法可以解决这个问题:

  • 向用户显示一条消息,要求他设置一个值
  • 如果该字段为空,则设置一个默认值,例如 00:00

如果您需要更多信息,请询问我。谢谢!

【问题讨论】:

  • 使用 Datetime.TryParse
  • row.GetCellValue(3).GetType() 显示什么?
  • 如果它是 Nullable 字段而不是尝试使用 Nullable DateTime 类型。 var newDuration = (DateTime?)row.GetCellValue(3);首先检查 null。
  • @Jon Skeet 它显示“{03/01/2015 00:00:00}
  • 我非常非常怀疑row.GetCellValue(3).GetType() 表明了这一点。

标签: c# .net infragistics


【解决方案1】:

在不确定的情况下尝试获取所需类型的值的典型模式

var value = someOtherValue as SomeType;
if (value != null)
{
    ... // value is a correct SomeType here
}

这适用于引用类型。如果结构(DateTime 是结构)是值类型,则必须先检查类型

var value = row.GetCellValue(3);
if(value is DateTime)
{
    var dateTime = (DateTime)value;
    ... // dateTime is a valid DateTime here
}

我的回答没有解释您为什么会遇到问题,而是说明了如何避免遇到问题(这可能不是一个好主意,但您似乎想要这样做)。

如果你的值可以是DBNull,那么只需检查它:

var value = row.GetCellValue(3);
if(value != DBNull.Value)
{
    var dateTime = (DateTime)value; // it must work now
    ...
}

【讨论】:

  • 我打赌他的大部分行都是DateTime,但其中一些是DbNull.Value,这就是它失败的价值。
  • @ScottChamberlain 你亏本了,我只有两列 DateTime,类型为 System.DateTime。但是defaultValue是DBNull,有关系吗?
  • 是的,这很重要。您有一些为空的行,这些行不显示为null,而是显示为DbNull.Value
  • @Sinatr 是的,检查类型可能会很好。但这是我要测试的值。我是 C# 的菜鸟... :/
  • @ScottChamberlain 我将其更改为 DateTime 并设置了一个默认值,例如“01/01/2015 00:00:00”,这很好。但是,当我让我的字段为空并尝试保存它时,不会将空字段更改为默认字段。并返回一个异常。
【解决方案2】:

其实我是这样做的:

try
{
       newDuration = (DateTime)row.GetCellValue(3);
}
catch
{
       row.SetCellValue(3, new DateTime());
       newDuration = (DateTime)row.GetCellValue(3);
}

它有效...感谢大家的帮助,我将在未来的开发中使用您所说的!

【讨论】:

  • 非常糟糕的选择。让异常驱动你的代码会导致明显的性能下降,特别是如果你有很多行要检查
【解决方案3】:

在wingrid有一个特定的事件来处理这个错误,它的datacellerror非常有用,不需要其他任何东西,希望这对某人有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多