如果条件不符合我的预期

时间:2015-12-09 12:59:27

标签: c# sql if-statement rowdatabound

我有一个包含DateTime列的boundfield的gridview。 在OnRowDataBound事件中,我检查该日期是否为NULL,并根据结果我做了一些动作。

if (!String.IsNullOrEmpty(e.Row.Cells[16].ToString()))

但是,即使单元格为空 - 它是否为空,日期将显示为1.1.1900 - 条件始终满足!

我做了一些解决方法,用''替换空值。 (空)因此将条件改为

if (!e.Row.Cells[16].Text != "01/01/1900 0:00:00")

这样可行,但随后我在gridview中显示了所有这些不相关的数据。

出了什么问题?

我被要求澄清可能会踩到这个帖子的未来用户的问题:

想象一下,你有这个SQL查询:

select getdate() as date
union all
select NULL

返回的数据是:

2015-12-22 12:58:37.650
NULL

如果你在gridview中显示这些数据并在OnRowDataBound事件中检查它的值,那么你就踩到了我遇到的问题:为了找到那些没有NULL条目的行,你不能这样做:

if(e.Row.Cells[12].Text != null)

它不起作用。 "没什么"在这种情况下显示在gridview单元格中有6个字符(不要问我为什么 - 这是纯粹的经验),因此可以通过

过滤
if(e.Row.Cells[12].Text.Length != 6) 

我在我的解决方案中实现了这一点,但现在写下来,我得出的结论是,只需指定正确的默认日期就可以避免这一切(" 1900-01-01")在SQL联合表达式中。实际上我认为我在SQL中踩到了一些不连贯的东西。在上面的Query中,不应该返回NULL,因为列的类型肯定是datetime。希望现在每个人都对这个评论很好。马丁

1 个答案:

答案 0 :(得分:0)

从我的观点来看,你做过什么,部分正确。但是不是使用那个硬编码的值,而是可以使用DateTime.MinValue来检查它。就像我的波纹管代码一样。我还没有测试过它。但我认为这会奏效。

if (e.Row.Cells[16]!= DateTime.MinValue))

DateTime字段无法为Null,因为它的Value类型,因此它存储为DateTime.Min。 因此,我们可以添加尾随问号(?)将DateTime转换为可为空的DateTime。然后您的代码将起作用。

DateTime? someDate = DateTime.MinValue;

        if(someDate != null)
        {
            //Do you CODE
        }