19

我正在尝试在我的 UI 上设置日期范围过滤器,并带有复选框来说明是否应使用 DateTimePicker 的值,例如

Dim fromDate As DateTime? = If(fromDatePicker.Checked, fromDatePicker.Value, Nothing)

然而设置fromDateNothing不会导致它被设置为Nothing'12:00:00 AM',并且以下If语句错误地执行过滤器,因为startDateis not Nothing

If (Not startDate Is Nothing) Then
    list = list.Where(Function(i) i.InvDate.Value >= startDate.Value)
End If

我如何真正确保startDate获得价值Nothing

4

5 回答 5

30

问题是它首先检查这个赋值的右侧,并确定它是类型DateTime(no ?)。然后执行任务。

这将起作用:

Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
                               fromDatePicker.Value, _
                               CType(Nothing, DateTime?))

因为它强制右侧的类型为DateTime?.

正如我在评论中所说,Nothing可以更类似于 C#default(T)而不是null

Nothing表示数据类型的默认值。默认值取决于变量是值类型还是引用类型。

于 2012-09-26T06:38:17.937 回答
3

用 VB.NET 和 EF 6.X 保存 null 是:

Dim nullableData As New Nullable(Of Date)

于 2014-12-19T13:24:48.023 回答
2

除了@Damien_The_Unbeliever 的好答案,使用New DateTime?也有效:

Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
                               fromDatePicker.Value, _
                               New DateTime?)

您可能会发现它看起来有点反直觉,为什么也许CType(Nothing, DateTime?)更可取。

于 2014-01-30T23:00:38.497 回答
0

New Date用作幻数:

Dim fromDate As New Date
If fromDatePicker.Checked Then
  fromDate = fromDatePicker.Value
End If
If fromDate <> New Date Then
  list = list.Where(Function(i) i.InvDate.Value >= fromDate.Value)
End If
于 2012-09-26T06:42:04.070 回答
0
        squery = "insert into tblTest values('" & Me.txtCode.Text & "', @Date)"
        Dim cmd = New SqlCommand(squery, con)

        cmd.Parameters.Add("@Date", SqlDbType.DateTime)
        If txtRequireDate.Text = "" Then
            cmd.Parameters("@Date").Value = DBNull.Value
        Else
            cmd.Parameters("@Date").Value = txtRequireDate.Text
        End If
于 2013-12-16T05:21:45.993 回答