如何在 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
使用填充控件的相同循环来计算和添加持续时间子项。您不需要在单独的循环中执行此操作。将 StartDate
和 EndDate
字符串转换为 DateTime
或 TimeSpan
对象,从开始时间减去结束时间得到具有持续时间的 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).Text
和 lvi.SubItems(2).Text
参数替换为它们的来源。它们在 模型中的属性 或它们的变量(如果您没有模型)。
我有一个 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")
.
使用填充控件的相同循环来计算和添加持续时间子项。您不需要在单独的循环中执行此操作。将 StartDate
和 EndDate
字符串转换为 DateTime
或 TimeSpan
对象,从开始时间减去结束时间得到具有持续时间的 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).Text
和 lvi.SubItems(2).Text
参数替换为它们的来源。它们在 模型中的属性 或它们的变量(如果您没有模型)。