Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “如何处理异常”;指定的强制转换无效";_C#_.net_Infragistics - Fatal编程技术网

C# “如何处理异常”;指定的强制转换无效";

C# “如何处理异常”;指定的强制转换无效";,c#,.net,infragistics,C#,.net,Infragistics,我用Infragistics制作了一个超级网格,其中有一列Datetime类型,格式为HH:mm 通常情况下,该列会填充类似“15:13”的值。我可以编辑它,设置我想要的,然后保存。但是如果我删除字段,它看起来是这样的:“:uu”,然后我保存我的表,我得到一个异常“指定的强制转换无效” 这是因为我试图保存一个未设置的值。我想知道如何处理这个异常 我试图将fiel与“null”进行比较,但它不起作用 var newDuration = (DateTime)row.GetCellValue(3);

我用Infragistics制作了一个超级网格,其中有一列Datetime类型,格式为HH:mm

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

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

我试图将fiel与“null”进行比较,但它不起作用

var newDuration = (DateTime)row.GetCellValue(3);
if (newDuration == null)
{
      MessageBox.Show("Please set all the fields.");
}
列的数据类型是System.DateTime,我将默认值设置为DB(DBNull),AllowDBNull是默认值

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

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

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

尝试获取所需类型的值而不确定是否正确的典型模式

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非常有用,不需要其他任何东西,希望这对某人有帮助

使用Datetime.tryparseRow.GetCellValue(3).GetType()显示什么?如果它是可为空的字段,请尝试使用可为空的Datetime类型。var newDuration=(DateTime?)row.GetCellValue(3);首先检查null。@Jon Skeet它显示“{03/01/2015 00:00:00}我非常非常怀疑
row.GetCellValue(3).GetType()
显示了这一点。我打赌money的大多数行都是
DateTime
,但其中一些行是
DbNull.Value
,这就是它失败的值。@ScottChamberlain你赔钱了,我只有两列DateTime,类型是System.DateTime。但是默认值是DbNull,这有关系吗?是的,有关系。你知道吗如果有些行是空的,那么这些行不会显示为
null
,而是显示为
DbNull.Value
@Sinatr是的,检查类型可能是一个好方法。但这是我要测试的值。我是C#…:/@ScottChamberlain的新手,我会按日期时间更改它,并设置一个默认值,如“01/01/2015 00:00:00”“好的。但是,当我让我的字段为空并尝试保存它时,不会将空字段更改为默认字段。并返回一个异常。非常糟糕的选择。让异常驱动代码将导致明显的性能损失,特别是在需要检查多行的情况下