【问题标题】:if condition not behaving the way I expect如果条件不符合我的预期
【发布时间】:2015-12-09 12:59:26
【问题描述】:

我有一个带有包含 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 Union 表达式中指定正确的默认日期(“1900-01-01”)来避免.实际上,我认为我在 SQL 中踩到了一些不连贯的东西。在上面的查询中不应返回 NULL,因为列的类型肯定是日期时间。希望现在每个人都能接受这个评论。马丁

【问题讨论】:

  • 如果它不是可以为空的日期时间,它将填写默认值
  • 你的第二个 if 语句甚至不应该编译。
  • 这似乎是一种非常奇怪的检查是否为空的方法:if (!String.IsNullOrEmpty(e.Row.Cells[16].ToString()))。使用 e.Row.Cells[16] != null 代替。无需将 needle 转换为字符串。
  • @Colm Prunty:它在哪里填写默认值?在 gridviews boundfield 中,那些为 NULL 的记录只是空的。
  • @M.kazem Akhgary:事实上它确实可以编译,看来我必须回到这个解决方法,因为这里没有说什么帮助我。

标签: c# sql if-statement rowdatabound


【解决方案1】:

从我的角度来看,你所做的一切都是正确的。但不是使用该硬编码值,而是可以使用 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
        }

【讨论】:

  • 我觉得default(DateTime)DateTime.MinValue在语义上更有意义
  • 我同意 DateTime 不能为 NULL。我用有日期的线条和没有日期的线条构建了那个网格视图。如何检查代码是否有日期?如果有什么,那么我可以将内容转换为日期并做任何我想做的事 DateTime Check = Convert.ToDateTime(e.Row.Cells[16]);但如果应用于空单元格,这在逻辑上会引发错误。
  • 已解决:string check = Convert.ToString(e.Row.Cells[16].Text 找出那个空的 NULL Gridview - 单元格的内容是如何处理的。结果是不可见的, 6 个字符的长字符串。利用它的长度,我将 if 条件调整为 if (e.Row.Cells[16].Text.Length != 6) 以获得非 NULL 行。经验解决方案
  • 您在问题中提到过什么,我为此提出了一个解决方案,现在我不确定您的具体要求是什么。如果您可以编辑您的问题,那么有一天它可能会帮助某人否则在其中找到他的解决方案。
  • 玛纳斯达斯。我没有看到你的评论。希望我的cmets澄清了这个问题。马丁
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多