如何计算将从DataGridView

时间:2016-03-31 00:14:55

标签: .net vb.net datagridview datetimepicker

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的屏幕截图,只是为了让您了解我尝试做的事情。 enter image description here

所以我的输出应该是一个消息框,显示我的2 DateTimePicker之间的行数。

1 个答案:

答案 0 :(得分:1)

主要问题是您的测试错误:

ServiceDataGridView.Rows(d).Cells(2).Value <= startDate

这是检查行是否在开始日期之前。为避免MessageBox暴风雪,你可以在循环后显示结果。您还应该启用Option StrictServiceDataGridView.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更快,但这样做只是为了计算它们似乎很浪费。