我使用SQL查询的结果加载DataTable
,例如'选择*来自表'。一些列是连续的日期/时间戳,在DataTable
中被视为double
,例如20170613103015,这些列也有"日期"在列名称中。
在此之后我将DataGridView
数据源设置为DataTable,我想知道的是,如果我可以将这些日期/时间戳格式化为实际日期时间,如果是这样的话?
我意识到这不起作用,但至少会显示我之后的格式。
dgvAssets.DataSource = rowData.asset_table;
for (int c = 0; c < dgvAssets.Columns.Count; c++)
{
if (dgvAssets.Columns[c].Name.Contains("DATE") && dgvAssets.Columns[c].ValueType == typeof(double))
{
dgvAssets.Columns[c].DefaultCellStyle.Format = "dd/MM/yyyy HH:mm:ss tt";
}
}
答案 0 :(得分:2)
以下是修复数据表的方法:
DataTable asset_table = rowData.asset_table;
int colCount = asset_table.Columns.Count;
for (int col = colCount - 1; colCount >= 0; colCount--)
{
string colName = asset_table.Columns[col].ColumnName;
if (colName.Contains("DATE"))
{
asset_table.Columns.Add("Temp Col", typeof(DateTime));
foreach (DataRow row in asset_table.AsEnumerable())
{
DateTime date = DateTime.ParseExact(((double)row[colName]).ToString(), "yyyyMMddhhmmss", CultureInfo.InvariantCulture);
row["Temp Col"] = date;
}
asset_table.Columns.Remove(colName);
asset_table.Columns["Temp Col"].ColumnName = colName;
asset_table.Columns[colName].SetOrdinal(col);
}
}
答案 1 :(得分:1)
使用CellFormatting
事件来制作视图的值。
首先收集相关的列索引,然后添加CellFormatting
事件(我做了一个lambda来捕获colsDate
变量)
dgvAssets.DataSource = rowData.asset_table;
int[] colsDate = dataGridView1.Columns
.Cast<DataGridViewColumn>()
.Where(col => col.Name.Contains("DATA"))
.Select(col => col.Index)
.ToArray();
dataGridView1.CellFormatting += (s, e) =>
{
if (colsDate.Contains(e.ColumnIndex))
{
var date = DateTime.ParseExact(e.Value.ToString(), "yyyyMMddhhmmss", CultureInfo.InvariantCulture);
e.Value = date.ToString("dd/MM/yyyy HH:mm:ss tt");
e.FormattingApplied = true;
}
};
//this its necessary if you want allow user edit the cell, and take the value back to db double format.
dataGridView1.CellParsing += (s, e) =>
{
if (colsDate.Contains(e.ColumnIndex))
{
var date = DateTime.Parse(e.Value.ToString());
e.Value = double.Parse(date.ToString("yyyyMMddhhmmss"));
e.ParsingApplied = true;
}
};
答案 2 :(得分:1)
使用CellFormating事件:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == Datecolumn.Index && e.Value !=null)
{
e.Value = DateTime.ParseExact(Convert.ToInt64(e.Value).ToString(), "yyyyMMddHHmmss", null).ToString("dd/MM/yyyy hh:mm:ss tt");
e.FormattingApplied = true;
}
}
将double格式化为DateTime就是一个例子。我不知道这是你的日期格式。您还可以修改条件e.ColumnIndex == Datecolumn.Index
,这样对所有列都有好处(例如检查某些数组中的索引/有效索引列表)
答案 3 :(得分:1)
我可以提供另一种方法,与已经提出的方法完全不同。
在sql查询中进行数据转换。
而不是select *
查询编写查询,指示所有列。在此期间将必要的列转换为datetime
。
这样的事情:
select id
, convert(datetime, format(SomeDate1, '####-##-## ##:##:##'))
, convert(datetime, format(SomeDate2, '####-##-## ##:##:##'))
from Table
假设您使用的是Sql Server。