我有一个包含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。希望现在每个人都对这个评论很好。马丁
答案 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
}