如何在 vb .NET 中将两次之间的持续时间添加到列表视图

How to add duration between two times to listview in vb .NET

我有一个 ListView,我想获取两次之间的持续时间并在每一行的第五列中添加。

I have no any idea how i can do this.
If you can help me, so show me with code please.
Like this:

我尝试使用此代码,但它不起作用:

For Each it As ListViewItem In ListView1.Items
            Dim dFrom As DateTime
            Dim dTo As DateTime
            Dim sDateFrom As String = it.SubItems(1).Text
            Dim sDateTo As String = it.SubItems(2).Text
            If DateTime.TryParse(sDateFrom, dFrom) AndAlso DateTime.TryParse(sDateTo, dTo) Then
                Dim TS As TimeSpan = dTo - dFrom
                Dim hour As Integer = TS.Hours
                Dim mins As Integer = TS.Minutes
                Dim secs As Integer = TS.Seconds
                Dim msec As Integer = TS.Milliseconds
                Dim timeDiff As String = ((hour.ToString("00") & ":") + mins.ToString("00") & ":") + secs.ToString("00") + "." + msec.ToString("000")            
                it.SubItems.Add(timeDiff)
            End If

我不知道你的密码

我想你可以使用下面的源来完成。

      Dim dFrom As DateTime
      Dim dTo As DateTime
      Dim sDateFrom As String = "00:00:06.200"
      Dim sDateTo As String = "00:00:07.680"

      If DateTime.TryParse(sDateFrom, dFrom) AndAlso DateTime.TryParse(sDateTo, dTo) Then

         Dim TS As TimeSpan = dTo - dFrom
         Dim hour As Integer = TS.Hours
         Dim mins As Integer = TS.Minutes
         Dim secs As Integer = TS.Seconds
         Dim msec As Integer = TS.Milliseconds

         Dim timeDiff As String = ((hour.ToString("00") & ":") + mins.ToString("00") & ":") + secs.ToString("00") + "." + msec.ToString("000")
         MsgBox(timeDiff) 'output 
      End If

确保您已准备好接收新 SubItem 的专栏。 我继续使用我在评论中询问的逗号。如果真的是句号,你可以更改.ParseExact

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    With ListView1.Columns
        .Add("Start Time")
        .Add("End Time")
        .Add("Duration")
    End With
    Dim li As New ListViewItem("00:00:06,200")
    li.SubItems.Add("00:00:07,680")
    ListView1.Items.Add(li)
End Sub

即使第一列是 ListViewItem 是文本 属性,它也是 SubItems(0)。这可能令人困惑。你的索引确实正确。

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    For Each li As ListViewItem In ListView1.Items
        Dim sDateFrom As String = li.SubItems(0).Text 'also works with il.Text
        Dim sDateTo As String = li.SubItems(1).Text
        Dim FormatString = "hh:mm:ss,fff"
        Dim provider = CultureInfo.InvariantCulture
        Dim StartTime = Date.ParseExact(sDateFrom, FormatString, provider)
        Dim EndTime = Date.ParseExact(sDateTo, FormatString, provider)
        Dim TS As TimeSpan = EndTime - StartTime
        'Dim timeDiff As String = $"{TS.Hours:00}:{TS.Minutes:00}:{TS.Seconds:00}.{TS.Milliseconds:000}"
        'or
        Dim timeDiff = TS.ToString("c")
        li.SubItems.Add(timeDiff)
    Next
End Sub

当您有一个包含多个变量的字符串需要插入时,请使用一个以 $ 开头的内插字符串。这允许您直接在 { } 中包含的行中插入变量。这更容易编写、阅读和理解。您还可以避免引号和连接字符的许多错误。变量的格式化是通过花括号内冒号后面的格式来完成的。如果你能忍受几个额外的零,你可以直接用 .ToString("c").

格式化 TimeSpan

使用填充控件的相同循环来计算和添加持续时间子项。您不需要在单独的循环中执行此操作。将 StartDateEndDate 字符串转换为 DateTimeTimeSpan 对象,从开始时间减去结束时间得到具有持续时间的 TimeSpan 对象,调用ToString 方法并传递 "s\.fff" 格式来设置持续时间子项的值。

例子

Imports System.Globalization
Dim inFormat = "hh\:mm\:ss\,fff"
Dim outFormat = "s\.fff"
Dim provider = CultureInfo.InvariantCulture

For Each lvi As ListViewItem In listView1.Items
    Dim tsStart As TimeSpan, tsEnd As TimeSpan

    If TimeSpan.TryParseExact(lvi.SubItems(1).Text, inFormat, provider, tsStart) AndAlso
        TimeSpan.TryParseExact(lvi.SubItems(2).Text, inFormat, provider, tsEnd) Then
        lvi.SubItems.Add((tsEnd - tsStart).ToString(outFormat))
    End If
Next

如果您已经在集合中以某种方式拥有持续时间子项,请将其设置为 .Text 属性 而不是调用 .Add(...) 方法。

lvi.SubItems(4).Text = (tsEnd - tsStart).ToString(outFormat)

同样,您不需要单独的循环,在添加其他子项的主循环中,将前面示例中的 lvi.SubItems(1).Textlvi.SubItems(2).Text 参数替换为它们的来源。它们在 模型中的属性 或它们的变量(如果您没有模型)。