1

我有一个非常简单的 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
4

3 回答 3

2

如果您正在自动生成听起来像您的列。使用网格格式的过程很糟糕。

您需要遍历网格的所有列,可能在数据绑定事件中,并将格式化表达式应用于您发现的任何列是日期列。

如果您不是自动生成并且您在网格中对列进行编码,您还将知道哪些列是日期列,并且您可以将相同的格式表达式应用于该列。它类似于 {0:ddMMyyyy} 但您必须查看它,因为这可能不太正确。

所以总结挂钩到数据绑定事件。遍历列集合并确定该列是否为日期列。我想知道你会如何做到这一点:)。如果您决定一列是日期列,请设置其格式表达式。

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

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

如果没有,我会开始查看数据阅读器,看看是否有什么可以在那里或使用数据适配器做的事情。我希望我能给你一个正确的答案,但我认为无论你设法做到这一点,它都不会很漂亮。对不起

于 2008-10-30T17:07:12.853 回答
2

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

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

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

于 2008-10-30T17:08:16.707 回答
0

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

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

于 2008-10-30T17:07:00.750 回答