我与 MS Access 数据库绑定的 datagridview 显示错误的时间格式
Posted
技术标签:
【中文标题】我与 MS Access 数据库绑定的 datagridview 显示错误的时间格式【英文标题】:My datagridview binded with MS Access Database displays wrong time format 【发布时间】:2021-10-12 08:02:11 【问题描述】:我正在尝试使用 itextsharp pdf 打印 pdf 报告,除“日期”和“时间”列中的值外,所有值都是正确的。 日期和时间以类似“dd/MM/yyyy tt hh:mm:ss”的格式显示例如。日期是:08/10/2021 AM 12:00:00,时间是:30/12/1899 AM 07:46:37。
我已经完成了下面提到的所有事情:
-
将 datetimepicker 中的日期值作为 datetimepicker.Value.ToString("dd/MM/yyyy") 和时间值插入 DateTime.Now.ToString("hh:mm:ss tt")
我在 MS Access 数据库中的日期和时间列的数据类型是日期/时间
我的数据库显示正确的格式值,datagridview 的时间列格式不正确,生成的 pdf 报告的日期和时间格式不正确。我唯一的问题是这怎么可能,因为数据库包含正确的数据,但是在 datagridview 中显示它之后,格式会发生变化,甚至在打印之后也是如此。下面我附上了可以帮助您了解场景的图片。
数据库中列的数据类型↓
数据库中的值↓
Datagridview 中的值↓
【问题讨论】:
看DataGridColumn.DefaultCellStyle.Format @Steve 它确实改变了两列的单元格样式,但是当我打印单元格的值时它返回长格式。 日期时间值没有格式。您获取该值,然后应用用于显示日期的工具中可用的格式选项。同时,当您检索 DateTime 值时,您不会获得任何特定的显示格式。同样是用于显示应用格式的工具。 【参考方案1】:您可以尝试像这样设置 DefaultStyle 属性
dataGridView1.Columns["YourColumn"].DefaultCellStyle.Format = "HH:mm:ss";
或者在设计器中设置,随你喜欢。
在您的数据库中,您的Time
列似乎只有一个时间值,但实际上没有。它使用可能的最低日期值,对于 Access 数据库,它是 1899 年 12 月 30 日。
当您只为该列提供时间而不是日期时,就会发生这种情况。 Acces(以及其他数据库)将简单地使用其可能的最低日期值来填补缺失的日期值。
为此,DataGridView 不得不同时显示日期和时间。
上面的属性将简单地指示 DataGridView 不显示日期部分,只显示时间部分。
如果你需要在 C# 代码中显示时间,你可以使用这个
YourDateTimeVariable.ToString("T");
但是,既然您将 date
和 time
都存储在 datetime 列中,为什么要将它们分开存储?
您可以将它们存储在一列中,并仅显示/使用您需要的部分。
编辑 回复您在 cmets 中发布的代码(请在您的问题中添加此代码,而不是在 cmets 中)
改变这个
invoicesDatagridview.Rows[i].Cells[1].Value.ToString())
进入这个
((datetime)invoicesDatagridview.Rows[i].Cells[1].Value).ToString("T"))
如果此列可以为空,您将需要一些额外的检查以避免转换错误。 此外,GridCell 中的格式永远不会在 ToString() 中使用,您正在对值执行 ToString(),而不是在显示文本上。 试试上面的代码来解决这个问题
编辑 要在下面回复您的评论:
打印代码不是重点。我只想知道 datagridview 单元格值和打印值如何具有不同的格式 - 卡兰乌格尔
通过设置 DefaultCellStyle,您可以告诉 DataGridView 使用什么格式来显示值。当您使用自己的代码使用 ToString() 打印此值时,这个 ToString() 究竟应该如何知道 DefaultCellStyle 设置?带有 ToString() 的打印代码与 DataGridView 完全没有联系,您只需将值传递给它即可。
看看这个例子
invoicesDatagridview.Rows[i].Cells[1].Value.ToString())
可以这样写
var someValue = invoicesDatagridview.Rows[i].Cells[1].Value;
someValue.ToString();
现在告诉我,someValue.ToString() 应该如何知道任何格式?
【讨论】:
我更改了默认单元格样式格式,datagridview 确实根据需要更改了值格式,但是当我从日期和时间打印值时,它仍然打印长格式。 如何打印数据?你能展示你如何打印数据的代码吗 这是我用来显示列值的代码 "MessageBox.Show("Date: " + invoicesDatagridview.Rows[i].Cells[0].Value.ToString() + "\nTime :“ + invoicesDatagridview.Rows[i].Cells[1].Value.ToString());”单元格中显示的值格式为“dd/MM/yyyy”格式,但返回格式为“dd/MM/yyyy tt hh:mm:ss”的值,如下所示。 @GuidoG 请编辑您的问题并在此处添加此代码,而不是在 cmets 中。阅读您的问题的人不会通过所有 cmets 查找相关信息,它应该在问题中,而不是在 cmets 中 打印代码不是重点。我只是想知道datagridview单元格值和打印值如何具有不同的格式【参考方案2】:Access 中数据类型 Date 的 epoc 是 1899-12-30,当您同时显示日期和时间时,该日期也会显示出来。
在 .Net 中,您可以应用格式字符串“T”来仅显示 小时-分钟-秒。例如:
DateTime time = new DateTime(1899, 12, 30, 8, 12, 16);
Console.WriteLine(time.ToString("T"));
// 08:12:16
【讨论】:
以上是关于我与 MS Access 数据库绑定的 datagridview 显示错误的时间格式的主要内容,如果未能解决你的问题,请参考以下文章