我有一个非常简单的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:ddMMyyyy},但你必须查找它,因为它可能不太正确。

所以总结钩入数据绑定事件。循环遍历列集合并确定该列是否为日期列。我想知道你怎么做:)如果您确定某列是日期列,请设置其格式表达式。

----------------------编辑

好的,你怎么写你从proc返回数据的方法返回一个数据表。在格式化数据表中的数据后,您可以将数据表绑定到网格。 datatable.Columns集合是DataColumns的集合,它们具有DataType属性。您可能正在寻找System.DateTime或DateTime,它可能是DataType属性本身的属性之一:)。我知道这很麻烦,但你要问的是肯定会很麻烦。一旦确定了日期列,您就可以对其进行一些操作。

如果不是,我会开始查看数据读取器,看看是否有任何可以在那里或数据适配器上做的事情。我希望我可以给你一个正确的答案,但我认为你设法做到这一点,它不会很漂亮。遗憾

其他提示

如果使用显式绑定列是一个选项,请将DataFormatString添加到boundField

<asp:BoundField DataField="Whatever" ... DataFormatString="{0:dd/MM/yyyy}" HtmlEncode="False"/ > 

否则你可以看一下格式化GridView.OnRowDataBound事件

您可以使用isDate()函数查看某些内容是否为有效日期,然后使用dateformatting选项使其看起来像您想要的那样。

日期格式化的一些示例: http://datawebcontrols.com/faqs/CustomizingAppearance/FormatDateTimeData.shtml

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top