格式化datagridview列以显示格式化的日期时间而不是序列日期时间

时间:2017-06-28 05:11:06

标签: c# datetime datagridview datatable

我使用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";
    }
}

4 个答案:

答案 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。