VB.NET:无需DataGridView格式化,修改DataTable格式并显示
VB.NET中修改DataTable日期格式后绑定DataGridView的解决方案
需求:无需通过DataGridView的格式化设置,直接修改DataTable的日期格式后,将其绑定到DataGridView显示。
现有问题:创建了包含DateTime类型CreatedDate列的DataTable,尝试用LINQ将日期格式化为yyyy/MM/dd,控制台输出格式化结果正常,但绑定到DataGridView后,日期仍显示默认格式。
现有代码
Dim dt As New DataTable("tbl") Dim dtColumn As DataColumn dtColumn = New DataColumn() dtColumn.DataType = GetType(DateTime) dtColumn.ColumnName = "CreatedDate" dt.Columns.Add(dtColumn) Dim dr As DataRow = dt.NewRow() dr("CreatedDate") = DateTime.Now Dim dr1 As DataRow = dt.NewRow() dr1("CreatedDate") = DateTime.Now.AddDays(1) dt.Rows.Add(dr) dt.Rows.Add(dr1) Dim query = dt.AsEnumerable().Select(Function(r) r.Field(Of DateTime)("CreatedDate").ToString("yyyy/MM/dd")) DataGridView1.DataSource = dt ' 控制台输出验证(注释部分) 'For Each r In query ' Console.WriteLine(r.ToString()) ' Console.WriteLine("Press any key to continue") ' Console.ReadKey() 'Next r
问题原因
原代码中的LINQ查询仅生成了一个格式化后的字符串序列,但并未修改原DataTable的结构或数据。绑定的还是原始的dt,其中CreatedDate列仍是DateTime类型,DataGridView会使用系统默认的日期格式渲染。
最佳解决方案
方案1:给DataTable添加计算列(推荐)
通过添加字符串类型的计算列,直接在DataTable中生成格式化后的日期字符串,绑定后可选择隐藏原DateTime列:
' 在原DataTable创建完成后添加计算列 dt.Columns.Add("FormattedCreatedDate", GetType(String), "FORMAT(CreatedDate, 'yyyy/MM/dd')") ' 绑定数据源并隐藏原列 DataGridView1.DataSource = dt DataGridView1.Columns("CreatedDate").Visible = False
方案2:通过LINQ创建新的DataTable
将格式化后的日期作为新列,生成新的DataTable后绑定:
' 生成包含格式化日期的匿名类型序列,再转为DataTable Dim newDt = dt.AsEnumerable().Select(Function(r) New With { .FormattedCreatedDate = r.Field(Of DateTime)("CreatedDate").ToString("yyyy/MM/dd") }).CopyToDataTable() ' 绑定新的DataTable DataGridView1.DataSource = newDt
效果说明
两种方案都能实现无需配置DataGridView,直接通过修改DataTable(或生成新表)来让日期以yyyy/MM/dd格式显示。方案1更适合需要保留原DateTime数据的场景,方案2则适合仅需显示格式化后字符串的场景。
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

