这个问题的目标是让我更好地了解到底发生了什么。根据数据的来源,似乎有不同的方法来解决这个问题。
情况是,当我从存储过程中多次提取数据时会有一些DateTime列,并且在某些时候我将不得不在我的网页上显示它们。现在,根据我的数据进入情况,似乎我必须使用不同的解决方案。它还取决于我是在标签内部显示它还是在GridView中显示它。我只想了解发生了什么,以及解决这个问题的最佳方法是什么。
以下是我遇到的情况以及我为解决问题所采取的措施(当然,在对该网站进行一些研究之后)。
情况1:
将存储过程中的DateTime列保存到DataTable中,然后将其用作GridView的DataSource,并将AutoGenerateColumns设置为false。
我对这种情况的解决方法是在ascx页面上格式化日期
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="lblTest1" runat="server" Text='<%# Eval("SomeDateField", "{0:MM/dd/yyyy}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
情况2: 与上面相同,但AutoGenerateColumns设置为true
我的解决方案是处理RowDataBound
上的格式protected void gvAppraisal_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
foreach (DataControlFieldCell cell in e.Row.Cells)
{
AutoGeneratedField field = cell.ContainingField as AutoGeneratedField;
if (field != null && field.DataType == typeof(DateTime))
cell.Text = DateTime.Parse(cell.Text).ToShortDateString();
}
}
}
}
情况3:将存储过程中的DataColumn保存到DataTable,然后在我页面某处的标签内使用该值。
我认为上面的方法也可行,我只是将数据更改为ShortDate,稍后我将不得不对此进行一些测试。但我做了一个辅助扩展方法来处理这个问题:
public static string ParseFormattedDateFromString(this string dateString, string dateFormat = "MM/dd/yyyy")
{
string formattedDate = "";
DateTime date;
if(DateTime.TryParse(dateString, out date))
{
formattedDate = date.ToString(dateFormat);
}
return formattedDate;
}
我的第三个例子似乎运行良好,只要我不处理GridView,但当我使用GridView时,该解决方案将无法正常工作。我想要的是一个适用于所有三种情况的解决方案。
现在,仅仅是试验和错误,是在设置数据源时gridview强制将其转换为特定日期/时间格式的问题?当你处理AutoGeneratedColumns和非AutoGeneratedColumns时,我无法理解为什么它看起来有所不同。
我还研究了将这些列转换为Date的解决方案,但即使我的数据在SQL Server上看起来很好,但在我运行程序时它仍然会带来时间段。
提前感谢您对理解这个问题的任何帮助,最后我只是想成为一名程序员并且想知道后台发生了什么,而不仅仅是使用我必须在没有工作的情况下工作的解决方案知道究竟是什么导致它起作用。
修改 JaydipJ在评论中的解决方案确实适用于我正在制作新存储过程的情况。但是,大多数时候我只需要使用预先存在的存储过程,我将无法对其进行更改。 --Joseph