C# 如何在datatable/datagridview中以小时、分钟、秒、百分之一百显示时间

C# 如何在datatable/datagridview中以小时、分钟、秒、百分之一百显示时间,c#,C#,我是一名嵌入式c程序员。我以前使用过c#,但这是我第一次尝试复杂的面向对象项目 我创建了一个datatable并链接到datagridview,以便在windows窗体中显示数据 到目前为止,它运行得很好。数据以整数形式存储,主要由事件发生后的时间信息组成,时间为100分之一秒。(它是比赛计时系统的前端)。例如12345意味着123.45秒 我想在表格2:03.45中显示这一点 我知道可以选择在数据表中以日期和时间格式存储数据。但是我不确定这是否能满足我的需要……没有日期要求,而且似乎也不包括第

我是一名嵌入式c程序员。我以前使用过c#,但这是我第一次尝试复杂的面向对象项目

我创建了一个datatable并链接到datagridview,以便在windows窗体中显示数据

到目前为止,它运行得很好。数据以整数形式存储,主要由事件发生后的时间信息组成,时间为100分之一秒。(它是比赛计时系统的前端)。例如12345意味着123.45秒

我想在表格2:03.45中显示这一点

我知道可以选择在数据表中以日期和时间格式存储数据。但是我不确定这是否能满足我的需要……没有日期要求,而且似乎也不包括第100秒


我可能可以格式化一个字符串,但这似乎有点笨重,所以我想检查没有更好的方法。此外,我还需要能够使用datagridview的排序功能,根据最短时间对每个列进行排序。这目前可以使用,但我不确定它是否适用于字符串?

您可以创建
TimeSpan
,然后将其格式化为您想要的任何格式:

TimeSpan span = TimeSpan.FromMinutes(123.45);
string label = span.ToString(@"hh\:mm\:ss\:ff");
输出:

02:03:27
现在,如果你想让输出是123分,45秒

double smd = 123.45;
TimeSpan span = TimeSpan.FromMinutes(smd);
string label = span.ToString(@"hh\:mm") + ":" + (int) (((decimal) smd % 1) * 100);

TimeSpan
将帮助您完成这项工作

根据您的描述,时间应以毫秒的形式存储在数据库中

所以,只要做:

var ts = TimeSpan.FromMilliseconds(12345);
var timeStr = ts.ToString("HH:mm:ss"); 

您可以通过将“HH:mm:ss”更改为其他格式来自定义日期时间格式。请参阅。

因为无法使用标准格式,所以需要将格式逻辑写入
DataGridView.CellFormatting
eventhandler

private void dataGridView1_CellFormatting(object sender, 
                                          DataGridViewCellFormattingEventArgs e)
{
    if (this.dataGridView1.Columns[e.ColumnIndex].Name.Equals("LapTime"))
    {
        var hundredSeconds = (int)e.Value;
        var milliseconds = (double)(hundredSeconds * 10.0);
        var timespan = TimeSpan.FromMilliseconds(milliseconds);
        e.Value = timespan.ToString(@"mm\:ss\.fff");
        // will produce 02:03.45
    }
}
您可以在表单的构造函数中“订阅”此事件

public YourForm()
{
    InitializeComponent();

    RaceResults.CellFormattiing += dataGridView1_CellFormatting;
}

格式字符串是正常的:啊,太棒了……timespan看起来正是我想要的……它能做百分之一秒吗?@NickThornton hh:mm:ss:nnnnnn-你可以把它归结为滴答声。对于个人计算机,时钟滴答声通常指主系统时钟,其运行频率为66 MHz。这意味着每秒有6600万个时钟滴答声(或周期),所以你可以得到100秒,你可以得到100000秒!确实如此。ff表示百分之一百。百分之一百表示在不太长的毫秒内……1秒除以100倍,而不是100倍1000@NickThornton在每个答案的左边是一个全息勾选框(在向上/向下的投票下),勾选一个答案会给你几分,让每个人都知道你的问题已经解决了。这里的礼仪也很好,祝你好运!谢谢大家…真的很有帮助谢谢大家…真的很有帮助…一定要喜欢C#…似乎你能想到的一切都是可能的…而且通常很简单,我已经将此代码添加到我的forms类中。但是,当我的datagridview更新时,它不会触发此事件(我添加了一个断点以确保)。要将此事件连接到我的datagridview,我还需要执行其他操作吗?看起来我需要这样的操作…RaceResults.CellStateChanged+=dataGridView1\u CellFormatting;但是放在哪里呢?这就是我尝试过的,但得到了以下错误…..“dataGridView1\u CellFormatting”的重载与委托“DataGridViewCellStateChangedEventHandler”的重载不匹配。为什么要使用
CellStateChanged
?订阅
CellFormatting
事件