我有一个动态的BoundField(用于DetailsView),其代码如下:
BoundField bf1 = new BoundField();
bf1.DataField = "CreateDate";
bf1.DataFormatString = "{0:dd/MM/yyyy}";
bf1.HtmlEncode = false;
bf1.HeaderText = "Sample Header 2";
dv.Fields.Add(bf1);
但是以某种方式,它仍然显示错误的格式:2013-04-29T18:15:20.270。
有什么办法可以解决此问题,使其显示“29/04/2013”吗?谢谢你的帮助。
最佳答案
确定数据源列的数据类型“CreateDate”。确保它产生的是实际的日期时间字段,而不是像varchar这样的字段。如果您的数据源是存储过程,则很有可能正在处理CreateDate以生成varchar以便格式化日期,如下所示:
SELECT CONVERT(varchar,TableName.CreateDate,126) AS CreateDate
FROM TableName ...
通常使用这样的CONVERT来使查询结果满足要处理这些结果的任何其他代码的要求。样式126是ISO 8601格式,这是一种适用于任何语言设置的国际标准。我不知道您的行业是什么,但这可能是故意的。你不想惹它。就像您报告的那样,此样式(126)以'2013-04-29T18:15:20.270'的形式生成日期的字符串表示!但是,如果以这种方式处理了CreateDate,则您将无法获取bf1.DataFormatString来显示“29/04/2013”。您必须首先从原始SQL数据源中的datetime类型列开始,以便bf1正确使用它。因此,只需将其添加到数据源查询中,并以不同的名称(例如CreateDate2)进行调用,以免打扰已经依赖于CreateDate的任何其他代码,如下所示:
SELECT CONVERT(varchar,TableName.CreateDate,126) AS CreateDate,
TableName.CreateDate AS CreateDate2
FROM TableName ...
然后,在代码中,必须将bf1绑定(bind)到“CreateDate2”,而不是原始的“CreateDate”,如下所示:
BoundField bf1 = new BoundField();
bf1.DataField = "CreateDate2";
bf1.DataFormatString = "{0:dd/MM/yyyy}";
bf1.HtmlEncode = false;
bf1.HeaderText = "Sample Header 2";
dv.Fields.Add(bf1);
瞧!您的日期现在应该显示为“29/04/2013”!