我与 MS Access 数据库绑定的 datagridview 显示错误的时间格式
My datagridview binded with MS Access Database displays wrong time format
我正在尝试使用 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.Value.ToString("dd/MM/yyyy") 和时间值 DateTime.Now.ToString("hh:mm:ss tt")
- 我在 MS Access 数据库中日期和时间列的数据类型是 Date/Time
我的数据库显示格式正确的值,datagridview 的时间列格式不正确,生成的 pdf 报告的日期和时间格式不正确。我唯一的问题是这怎么可能,因为数据库由正确的数据组成,但在 datagridview 中显示后,格式会发生变化,甚至在打印后也会发生变化。下面我附上了可以帮助您了解场景的图片。
数据库中列的数据类型↓
数据库中的值↓
Datagridview 中的值↓
Access中数据类型日期的时间是1899-12-30,当你同时显示日期和时间时,那个日期也会显示。
在 .Net 中,您可以应用格式字符串“T”来仅显示 小时-分钟-秒。例如:
DateTime time = new DateTime(1899, 12, 30, 8, 12, 16);
Console.WriteLine(time.ToString("T"));
// 08:12:16
您可以尝试像这样设置 DefaultStyle属性
dataGridView1.Columns["YourColumn"].DefaultCellStyle.Format = "HH:mm:ss";
或者在设计器里面设置,随便你怎么设置。
在您的数据库中,您的 Time
列似乎只有时间值,但实际上没有。它使用可能的最低日期值,对于 Access 数据库是 30/12/1899。
当您只为该列提供时间而没有日期时,就会发生这种情况。 Acces(以及其他数据库)将简单地使用其可能的最低日期值来填充缺失的日期值。
因此,DataGridView 别无选择,只能同时显示日期和时间。
上面的 属性 将简单地指示 DataGridView 不显示日期部分,仅显示时间部分。
如果需要在C#代码中显示时间,可以使用这个
YourDateTimeVariable.ToString("T");
但是,既然您将 date
和 time
都存储在日期时间列中,为什么要将它们分开存储?
您可以只将它们存储在一列中,并且 show/use 只存储您需要的部分。
编辑
回复您在评论中发布的代码(请在您的问题中添加此代码,而不是在评论中)
改变这个
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() 应该如何知道任何格式?
我正在尝试使用 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.Value.ToString("dd/MM/yyyy") 和时间值 DateTime.Now.ToString("hh:mm:ss tt")
- 我在 MS Access 数据库中日期和时间列的数据类型是 Date/Time
我的数据库显示格式正确的值,datagridview 的时间列格式不正确,生成的 pdf 报告的日期和时间格式不正确。我唯一的问题是这怎么可能,因为数据库由正确的数据组成,但在 datagridview 中显示后,格式会发生变化,甚至在打印后也会发生变化。下面我附上了可以帮助您了解场景的图片。
数据库中列的数据类型↓
数据库中的值↓
Datagridview 中的值↓
Access中数据类型日期的时间是1899-12-30,当你同时显示日期和时间时,那个日期也会显示。
在 .Net 中,您可以应用格式字符串“T”来仅显示 小时-分钟-秒。例如:
DateTime time = new DateTime(1899, 12, 30, 8, 12, 16);
Console.WriteLine(time.ToString("T"));
// 08:12:16
您可以尝试像这样设置 DefaultStyle属性
dataGridView1.Columns["YourColumn"].DefaultCellStyle.Format = "HH:mm:ss";
或者在设计器里面设置,随便你怎么设置。
在您的数据库中,您的 Time
列似乎只有时间值,但实际上没有。它使用可能的最低日期值,对于 Access 数据库是 30/12/1899。
当您只为该列提供时间而没有日期时,就会发生这种情况。 Acces(以及其他数据库)将简单地使用其可能的最低日期值来填充缺失的日期值。
因此,DataGridView 别无选择,只能同时显示日期和时间。
上面的 属性 将简单地指示 DataGridView 不显示日期部分,仅显示时间部分。
如果需要在C#代码中显示时间,可以使用这个
YourDateTimeVariable.ToString("T");
但是,既然您将 date
和 time
都存储在日期时间列中,为什么要将它们分开存储?
您可以只将它们存储在一列中,并且 show/use 只存储您需要的部分。
编辑
回复您在评论中发布的代码(请在您的问题中添加此代码,而不是在评论中)
改变这个
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() 应该如何知道任何格式?