0

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

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

但是,即使单元格为 NULL - 它是否为空,日期将显示为 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) 

我在我的解决方案中实现了这一点,但现在写这篇文章时,我得出的结论是,只需在 SQL 联合表达式中指定正确的默认日期(“1900-01-01”),就可以避免这一切。实际上,我认为我在 SQL 中踩到了一些不连贯的东西。在上面的查询中不应返回 NULL,因为列的类型肯定是日期时间。希望现在每个人都能接受这个评论。马丁

4

1 回答 1

0

从我的角度来看,你所做的一切都是正确的。但不是使用该硬编码值,而是可以使用 DateTime.MinValue.Like 我的波纹管代码来检查它。我没有测试过。但我认为这会奏效。

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

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

DateTime? someDate = DateTime.MinValue;

        if(someDate != null)
        {
            //Do you CODE
        }
于 2015-12-09T13:09:24.350 回答