如何处理异常"Specified cast is not valid"

How to handle an exception "Specified cast is not valid"

我用 Infragistics 制作了一个 UltraGrid,其中有一列格式为 HH:mm.

的 Datetime 类型

通常,该列填充的值如下:“15:13”。我可以编辑它并设置我想要的然后保存。但是如果我删除它看起来像这样的字段:“_ : _”然后我保存我的 table,我得到一个异常 "Specified cast is not valid".

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

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

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

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

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

问我是否需要更多信息。谢谢!

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

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
    ...
}

其实我是这样做的:

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

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

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