Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 格式化datagridview列以显示格式化的日期时间而不是串行日期时间_C#_Datetime_Datagridview_Datatable - Fatal编程技术网

C# 格式化datagridview列以显示格式化的日期时间而不是串行日期时间

C# 格式化datagridview列以显示格式化的日期时间而不是串行日期时间,c#,datetime,datagridview,datatable,C#,Datetime,Datagridview,Datatable,我加载一个带有SQL查询结果的DataTable,例如“Select*fromtable”。一些列是串行的日期/时间戳,在数据表中被视为双精度,例如20170613103015,这些列的列名中也有“日期” 在此之后,我将一个DataGridView数据源设置为DataTable,我想知道的是,是否可以将这些日期/时间戳格式化为实际的日期时间,如果可以,如何 我意识到这不起作用,但至少显示了我所追求的格式 dgvAssets.DataSource = rowData.asset_table; f

我加载一个带有SQL查询结果的
DataTable
,例如“Select*fromtable”。一些列是串行的日期/时间戳,在
数据表中被视为
双精度
,例如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";
    }
}
dgvAssets.DataSource=rowData.asset_表;
对于(int c=0;c
使用
CellFormatting
事件来编辑视图值。 首先收集相关的列索引,然后添加
CellFormatting
事件(我使用lambda捕获
colsDate
变量)

dgvAssets.DataSource=rowData.asset_表;
int[]colsDate=dataGridView1.Columns
.Cast()
.Where(col=>col.Name.Contains(“数据”))
.选择(列=>列索引)
.ToArray();
dataGridView1.CellFormatting+=(s,e)=>
{
if(colsDate.Contains(例如ColumnIndex))
{
var date=DateTime.ParseExact(例如Value.ToString(),“yyyyMMddhhmmss”,CultureInfo.InvariantCulture);
e、 值=日期ToString(“dd/MM/yyyy HH:MM:ss tt”);
e、 FormattingApplied=true;
}
};
//如果您希望允许用户编辑单元格,并将值恢复为db double格式,则这是必需的。
dataGridView1.CellParsing+=(s,e)=>
{
if(colsDate.Contains(例如ColumnIndex))
{
var date=DateTime.Parse(例如Value.ToString());
e、 Value=double.Parse(date.ToString(“yyyyMMddhhmmss”);
e、 ParsingApplied=真;
}
};

使用
CellFormatting
事件来编辑视图值。 首先收集相关的列索引,然后添加
CellFormatting
事件(我使用lambda捕获
colsDate
变量)

dgvAssets.DataSource=rowData.asset_表;
int[]colsDate=dataGridView1.Columns
.Cast()
.Where(col=>col.Name.Contains(“数据”))
.选择(列=>列索引)
.ToArray();
dataGridView1.CellFormatting+=(s,e)=>
{
if(colsDate.Contains(例如ColumnIndex))
{
var date=DateTime.ParseExact(例如Value.ToString(),“yyyyMMddhhmmss”,CultureInfo.InvariantCulture);
e、 值=日期ToString(“dd/MM/yyyy HH:MM:ss tt”);
e、 FormattingApplied=true;
}
};
//如果您希望允许用户编辑单元格,并将值恢复为db double格式,则这是必需的。
dataGridView1.CellParsing+=(s,e)=>
{
if(colsDate.Contains(例如ColumnIndex))
{
var date=DateTime.Parse(例如Value.ToString());
e、 Value=double.Parse(date.ToString(“yyyyMMddhhmmss”);
e、 ParsingApplied=真;
}
};

以下是修复数据表的方法:

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);
    }
}

下面是修复datatable的方法:

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);
    }
}

使用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
,这样对所有列都有好处(例如,检查是否在某种数组/有效索引列表中引入索引)

使用CellFormatting事件:

    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
,这样对您的所有列都有好处(例如,检查是否在某种数组/有效索引列表中引入索引)

我可以提供另一种方法,与已经提出的方法完全不同

在sql查询中执行数据转换

选择*
query而不是
query,编写查询,指示所有列。在此期间,将必要的列转换为
datetime

大概是这样的:

select id
     , convert(datetime, format(SomeDate1, '####-##-## ##:##:##'))
     , convert(datetime, format(SomeDate2, '####-##-## ##:##:##'))
from Table

假设您使用的是Sql Server。

我可以提供另一种方法,与已经提出的方法完全不同

在sql查询中执行数据转换

选择*
query而不是
query,编写查询,指示所有列。在此期间,将必要的列转换为
datetime

大概是这样的:

select id
     , convert(datetime, format(SomeDate1, '####-##-## ##:##:##'))
     , convert(datetime, format(SomeDate2, '####-##-## ##:##:##'))
from Table

假设您使用的是Sql Server。

不应将日期时间信息作为双精度值存储在数据库中。如果你能修好,你也修好了。如果无法解决此问题,则必须执行字符串操作,从该值中标识日期时间组件,以创建实际的日期时间值。不幸的是,更改数据库中的双精度数据类型超出了我的控制范围。您不应将日期时间信息作为双精度值存储在数据库中。如果你能修好,你也修好了。如果无法解决此问题,则必须执行字符串操作,从该值中标识日期时间组件,以创建实际的日期时间值。不,不幸的是,更改数据库中的双精度数据类型超出了我的控制范围,因为日期不是标准的日期时间格式。需要使用ParseExact()。@jdweng谢谢!而真正的答案是你的。。。但这两个答案在更新数据时都会遇到问题。需要作为wpf转换器…无法工作,因为日期不是标准的日期时间格式。需要使用ParseExact()。@jdweng谢谢!而真正的答案是你的。。。但这两个答案在更新数据时都会遇到问题。作为一个wpf转换器的需要…才华横溢正是我所寻找的,其他答案也是伟大的。非常感谢。辉煌的法律