Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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#_Sql_Winforms_Datagridview_Timestamp - Fatal编程技术网

如何使用C#只获取时间戳的时间部分而不带时区并将其放入datagridview中?

如何使用C#只获取时间戳的时间部分而不带时区并将其放入datagridview中?,c#,sql,winforms,datagridview,timestamp,C#,Sql,Winforms,Datagridview,Timestamp,我在将DateTime格式转换为datagridview时遇到问题。基本上情况是这样的:在数据库中,我有4列,类型为:TIMESTAMP,不带时区。我使用SQL查询从数据库中获取数据,我想写的是没有时区类型的时间戳,没有日期,只有时间 前。 第一行列“Arrival”有值:“2017-03-08 14:44:32”,我想从该单元格中获取“14:44:32”,并将其放入datagridview的“Arrival”列中。当我发出如下命令时: foreach (DataRow row in dt.R

我在将DateTime格式转换为datagridview时遇到问题。基本上情况是这样的:在数据库中,我有4列,类型为:TIMESTAMP,不带时区。我使用SQL查询从数据库中获取数据,我想写的是没有时区类型的时间戳,没有日期,只有时间

前。 第一行列“Arrival”有值:“2017-03-08 14:44:32”,我想从该单元格中获取“14:44:32”,并将其放入datagridview的“Arrival”列中。当我发出如下命令时:

 foreach (DataRow row in dt.Rows)
 {
     string spremanje_string = row["Arrival"].ToString();
     string pretvorba = spremanje_string.Substring(spremanje_string.IndexOf(' ') + 1);
     row["Arrival"] = DateTime.ParseExact(pretvorba, "HH:mm:ss", CultureInfo.InvariantCulture);
 }
(不介意foreach,它只是该循环代码的一部分)

C#给了我一个错误,说:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

Additional information: String was not recognized as a valid DateTime.

我可以想出三种解决方案

  • 设置DefaultCellStyle最简单的方法
  • 在填充dataGridView(您在ForEach中尝试的内容)后设置格式
  • 在数据进入之前设置格式 示例1:

    dataGridViewName.Columns["columnName"].DefaultCellStyle.Form‌​‌​at = "HH:mm:ss";
    
    foreach (DataRow row in dt.Rows)
    {
        string dateTime = row["Arrival"].ToString();
        string time = dateTime.Split(' ')[1];
        //Do not convert to DateTime, no use if you will only use it to display (string)
        row.Cells["Arrival"].Value = time;
    }
    
    第2个示例:

    dataGridViewName.Columns["columnName"].DefaultCellStyle.Form‌​‌​at = "HH:mm:ss";
    
    foreach (DataRow row in dt.Rows)
    {
        string dateTime = row["Arrival"].ToString();
        string time = dateTime.Split(' ')[1];
        //Do not convert to DateTime, no use if you will only use it to display (string)
        row.Cells["Arrival"].Value = time;
    }
    
    第3个示例:

    将日期值添加到DataGridView时(据我所知,这对数据源不起作用):

    如果您的行[“Arrival”]是DateTime,则可以使用.TimeOfDay

    这会给你一个时间跨度

    因此,这里有几种可能的解决方案:

    • 您可以将行[“Arrival”]的类型更改为TimeSpan,并在从数据库读取时获取TimeOfDay

    • 如果只需要显示时间(无需排序和编辑),请在DateTime上使用.ToString(“HH:mm:ss”)来获取字符串

    • 如果您使用的是WPF,那么可以在绑定中使用DataGridTextColumn和StringFormat={HH:mm:ss}


    为什么它必须是
    日期时间
    而不仅仅是
    字符串
    或者可能是
    时间跨度
    ?我没有制定规则=)你想要一个没有日期的日期时间吗?这不是datetime问题是,datetime是用于数据库的,我想要的是用于用户部分,当您没有4列带有日期+时间,一列带有相同日期时,更容易阅读。。。。。现在您就明白为什么了。在向DataGridView添加DateTime时,只需执行DateTime.TimeOfDay而不是DateTime我有一个问题:在Ex.nr 1中:您的意思是我在执行之后需要执行该操作:
    datagridview1.DataSource=dtforeach基于您的,将其放置在您拥有的任何位置。但是考虑到它从DataGrid获取一个值,网格必须首先有值DataSource@MarkoPetrePetričevićI添加了一种更简单的方法,即最后一种。我建议你使用它,因为它不必在一个循环中,而且只是一行。是吗,当我开始调试时,它说可变时间是时间的一部分,而且一切看起来都很好,但它在datagridview上并没有这样显示,我很困惑,我所做的一切,调试都显示了很好,但当它在datagridview上显示时,它并没有应用那个更改。