Hello Guys所以我在这里遇到一个麻烦,计算在我的2个DateTimePicker中我所选日期之间的行数我可能会做错了你会帮我识别吗?我不太确定我是否以正确的方式做到这一点。
以下是我的示例代码:
Dim startDate As DateTime = DateTimePicker1.Value
Dim endDate As DateTime = DateTimePicker2.Value
Dim count As Integer
For d As Integer = 0 To ServiceDataGridView.Rows.Count - 1
If ServiceDataGridView.Rows(d).Cells(2).Value <= startDate AndAlso endDate >= ServiceDataGridView.Rows(d).Cells(2).Value Then
count = count + 1
MessageBox.Show(count)
End If
Next
以下是我的DateTimePicker和DataGridView的屏幕截图,只是为了让您了解我尝试做的事情。
所以我的输出应该是一个消息框,显示我的2 DateTimePicker之间的行数。
答案 0 :(得分:1)
主要问题是您的测试错误:
ServiceDataGridView.Rows(d).Cells(2).Value <= startDate
这是检查行是否在开始日期之前。为避免MessageBox
暴风雪,你可以在循环后显示结果。您还应该启用Option Strict
:ServiceDataGridView.Rows(d).Cells(2).Value
返回Object
,但您要将其分配给DateTime
var。您应该自己处理它们,而不是将这些转换留给编译器。
从数据源访问数据的速度更快,因为它实际上就是这样。控件主要是我们向用户显示数据。例如:
Dim dt As DateTime ' temp var
count = 0
For Each dr As DataRow In dtSample.Rows
dt = Convert.ToDateTime(dr(8))
If dt >= startDt AndAlso dt <= stopDt Then count += 1
Next
temp var是因为项目值仅为评估转换一次。这将比迭代DGV行(使用10,000行数据)快至少2倍。扩展方法将占用较少的代码,但根据数据量可能会稍慢:
Dim count = dtSample.AsEnumerable.
Where(Function(w) w.Field(Of DateTime)("ItemDate") >= startDt AndAlso
w.Field(Of DateTime)("ItemDate") <= stopDt).
Count()
您还可以使用DataTable.Select
方法获取符合条件的行数组。这也比使用DGV更快,但这样做只是为了计算它们似乎很浪费。