我正在尝试在我的UI上设置日期范围过滤器,并带有复选框,说明是否应该使用DateTimePicker的值,例如
Dim fromDate As DateTime? = If(fromDatePicker.Checked, fromDatePicker.Value, Nothing)
然而,将fromDate
设置为Nothing
并不会将其设置为Nothing
,而是设置为'12:00:00 AM',以及以下If
语句错误地执行了过滤器,因为startDate
不是Nothing
。
If (Not startDate Is Nothing) Then
list = list.Where(Function(i) i.InvDate.Value >= startDate.Value)
End If
如何确保startDate
获得Nothing
的值?
答案 0 :(得分:25)
问题在于,它首先检查此作业的右侧,并确定其类型为DateTime
(无?
)。然后执行作业。
这将有效:
Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
fromDatePicker.Value, _
CType(Nothing, DateTime?))
因为它强制右侧的类型为DateTime?
。
正如我在评论中所说,Nothing
可能更类似于C#的default(T)
而不是null
:
Nothing
表示数据类型的默认值。默认值取决于变量是值类型还是引用类型。
答案 1 :(得分:3)
用VB.NET和EF 6.X保存null是:
Dim nullableData As New Nullable(Of Date)
答案 2 :(得分:2)
除了@ Damien_The_Unbeliever的好答案外,使用New DateTime?
也有效:
Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
fromDatePicker.Value, _
New DateTime?)
您可能会发现它看起来有点反直觉,为什么CType(Nothing, DateTime?)
更可取。
答案 3 :(得分: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
答案 4 :(得分: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