GridView单元格日期格式转换求助:从dd/MM/yyyy H:ss:mm转yyyy-MM-dd
解决GridView动态绑定日期格式的问题
别发愁,这种动态自动生成列的场景确实没法直接用ItemTemplate来格式化,我给你几个实用的解决方案,挑适合你的来用:
方法1:在SQL查询中直接格式化日期(最简便)
既然你的数据源是SQL查询结果,那直接在查询语句里把日期转成你要的yyyy-MM-dd格式是最省事的,这样GridView绑定后直接显示格式化好的字符串,不需要额外处理。
以SQL Server为例,你可以用CONVERT函数:
SELECT CONVERT(varchar, StartDate, 23) AS StartDate, OtherColumns... FROM YourTableName
这里的23是SQL Server内置的格式代码,对应yyyy-MM-dd。如果是MySQL的话,用DATE_FORMAT(StartDate, '%Y-%m-%d') AS StartDate即可。
方法2:利用GridView的RowDataBound事件后台处理
如果不想修改SQL语句,可以在后台代码里通过RowDataBound事件来逐行处理日期格式:
- 先在.aspx页面的GridView标签里添加事件绑定:
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound"> </asp:GridView>
- 然后在后台.cs文件里实现这个事件方法:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { // 只处理数据行,跳过表头、页脚等行 if (e.Row.RowType == DataControlRowType.DataRow) { // 从DataItem里获取原始日期数据,比依赖列索引更可靠 DataRowView rowData = e.Row.DataItem as DataRowView; if (rowData != null) { DateTime startDate = Convert.ToDateTime(rowData["StartDate"]); // 找到对应列的索引(通过列名匹配,避免列顺序变化出错) int targetColumnIndex = ((GridView)sender).Columns .Cast<DataControlField>() .ToList() .FindIndex(col => col.HeaderText.Equals("StartDate", StringComparison.OrdinalIgnoreCase)); if (targetColumnIndex != -1) { e.Row.Cells[targetColumnIndex].Text = startDate.ToString("yyyy-MM-dd"); } } } }
方法3:在DataBound事件中设置自动生成列的格式
如果你的GridView是通过数据源控件(比如SqlDataSource)绑定的,还可以在DataBound事件里找到对应的日期列,直接设置它的格式:
protected void GridView1_DataBound(object sender, EventArgs e) { foreach (DataControlField column in GridView1.Columns) { // 判断是否是绑定列,且绑定的字段是StartDate if (column is BoundField boundField && boundField.DataField == "StartDate") { boundField.DataFormatString = "{0:yyyy-MM-dd}"; boundField.HtmlEncode = false; // 必须设置为false,否则格式不会生效 } } }
这三个方法都能解决你的问题,优先推荐方法1,操作最简单;如果业务上不能修改SQL,就用方法2,灵活性更高。
内容的提问来源于stack exchange,提问作者Edmund
相关产品推荐
相关产品推荐

