我有一个非常简单的ASP.Net页面,它充当存储过程的前端。它只是运行程序并使用gridview控件显示输出:少于40行总代码,包括aspx标记。存储过程本身非常不稳定。它用于多种用途,输出格式定期更改。
整个过程非常有用,因为gridview控件并不需要关心存储过程返回的列:它只是在页面上显示它们,这正是我想要的。
然而,这个运行的数据库在时间部分不是很重要的地方有很多日期时间列 - 它总是被清零。我希望能够做的是控制gridview中日期时间列的格式,而不知道那些列的确切位置。每当结果中的列具有日期时间类型时,只需应用一个将剪掉时间组件的给定格式字符串。
我知道我可以在数据库中转换为varchar,但我真的不想让开发人员关心查询中的格式化,这无论如何都属于表示级别。还有其他想法吗?
最后使用此代码以可接受(或至少改进)的方式工作:
Protected Sub OnRowDatabound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim d As DateTime
For Each cell As TableCell In e.Row.Cells
If Date.TryParse(cell.Text, d) AndAlso d.TimeOfDay.Ticks = 0 Then
cell.Text = d.ToShortDateString()
End If
Next cell
End If
End Sub
答案 0 :(得分:2)
如果您自动生成听起来像你的列。使用网格格式的过程非常糟糕。
您可能需要循环遍历网格的所有列,可能是在数据绑定事件中,并将格式表达式应用于您找到的任何列是日期列。
如果您没有自动生成并且您在网格中编码了列,您还会知道哪些列是日期列,并且您可以将相同的格式表达式应用于该列。它类似于{0:ddMMyyyy},但你必须查找它,因为它可能不太正确。
所以总结钩入数据绑定事件。循环遍历列集合并确定该列是否为日期列。我想知道你怎么做:)如果您确定某列是日期列,请设置其格式表达式。
瞧
----------------------编辑
好的,你怎么写你从proc返回数据的方法返回一个数据表。在格式化数据表中的数据后,您可以将数据表绑定到网格。 datatable.Columns集合是DataColumns的集合,它们具有DataType属性。您可能正在寻找System.DateTime或DateTime,它可能是DataType属性本身的属性之一:)。我知道这很麻烦,但你要问的是肯定会很麻烦。一旦确定了日期列,您就可以对其进行一些操作。
如果不是,我会开始查看数据读取器,看看是否有任何可以在那里或数据适配器上做的事情。我希望我可以给你一个正确的答案,但我认为你设法做到这一点,它不会很漂亮。遗憾
答案 1 :(得分:2)
如果使用显式绑定列是一个选项,请将DataFormatString添加到boundField
<asp:BoundField DataField="Whatever" ... DataFormatString="{0:dd/MM/yyyy}" HtmlEncode="False"/ >
否则你可以看一下格式化GridView.OnRowDataBound事件
答案 2 :(得分:0)
您可以使用isDate()函数查看某些内容是否为有效日期,然后使用dateformatting选项使其看起来像您想要的那样。
日期格式化的一些示例: http://datawebcontrols.com/faqs/CustomizingAppearance/FormatDateTimeData.shtml